2015-07-10 24 views
8

Yani dinleyicileri tanımlarken laravel olay doc göre, gerekli herhangi mantığı kendi kolu yönteminde olay örneğini almak ve gerçekleştirebilir: Yanilaravel dinleyici birden olaya dinlemek

public function handle(FoodWasPurchased $event) 

FoodWasPurchased benim eğer olay (EventServiceProvider ayarlanır varsaydıkları) aşağıdaki gibi tanımlanır:

public function __construct(Food $food) 
{ 
    $this->food = $food; 
} 

ben do tarafından dinleyicimizden durumunda $ gıda erişebilecek ing:

$event->food->doSomething(); 

Ama şimdi bir soru dinleyici birden fazla olayı dinliyorsa benim sorum nedir?

Event FoodWasPurchased -> Listener Bill 
Event DrinksWasPurchased -> Listener Bill 

Ben is ben dinleyici kolu yönteminde olay örneğini belirtmedi şimdi ne yaptı: koşul $ durumunda alınan kontrol etmek eğer

public function handle($event) 

daha sonra bir kullanabilirsiniz:

if (isset($event->food)) { 

    // Do something... 

} elseif (isset($event->drinks)) { 

    // Do something else... 

} 

Eminim daha iyi bir yol var. Ya da en iyi uygulama, bir dinleyicinin yalnızca bir tek olayı dinlemesini sağlamaktır mı?

cevap

12

Birden olaylar dinleyebilirsiniz:

// Instead of Food or Drink use parent Type 
use Illuminate\Database\Eloquent\Model; 

class DrinWasPurchased extends Event 
{ 
    // Instead of Food or Drink typehint Model   
    public function __construct(Model $model) 
    { 
     // Instead of $this->food or $this->drink use a generic name 
     $this->item = $model; 
    } 
} 

Sonra dinleyicinin handle yönteminde böyle bir şey denemek Listeners klasörüne yerleştirildi ancak birden fazla etkinliği dinleyebiliyor. etkinlikleriniz bir sözleşme veya arayüz uygun olursa

<?php 

namespace App\Listeners; 

class UserEventListener{ 
    /** 
    * Handle user login events. 
    */ 
    public function onUserLogin($event) {} 

    /** 
    * Handle user logout events. 
    */ 
    public function onUserLogout($event) {} 

    /** 
    * Register the listeners for the subscriber. 
    * 
    * @param Illuminate\Events\Dispatcher $events 
    * @return array 
    */ 
    public function subscribe($events){ 
     $events->listen(
      'App\Events\UserLoggedIn', 
      'App\Listeners\[email protected]' 
     ); 

     $events->listen(
      'App\Events\UserLoggedOut', 
      'App\Listeners\[email protected]' 
     ); 
    } 

} 
+0

Bu sınıfı nasıl kontrolörden arayabiliriz? –

+0

EventListeners, ilgili olay kaldırıldığında tetiklenir. Bu yüzden, denetleyicideki olayı tetiklemelisiniz. – jagzviruz

4

Siz de böyle bir şey deneyebilirsiniz: Hangi Event Subscribers kullanarak

public function handle(\App\Events\Event $event) 
{ 
    if($event->item instanceof \App\Food) 
    { 
     $item->eat(); // Just an example 
    } 

    if($event->item instanceof \App\Drink) 
    { 
     $item->drink(); // Just an example 
    } 
} 
+0

Bu artışlar yapmak

'App\Events\NewMessageSent' => [ 'App\Listeners\SendNewMessageNotificationToRecipients', ], 'App\Events\MessageReplied' => [ 'App\Listeners\SendNewMessageNotificationToRecipients', ], 'App\Events\MessageForwarded' => [ 'App\Listeners\SendNewMessageNotificationToRecipients', ], 

2- etkinliklerle dinleyici oluşturmak okunabilirliği. Peki ya bir dinleyici 2'den fazla olay dinlerse? (Ya da belki de en iyi yol, tüm olayların aynı türden örneği almasını sağlamaktır?) –

+0

Eğer PHPStorm kullanırsanız, '$ event' türünde ipucu bırakabilir ve @param doc kullanabilirsiniz. – Kyslik

4

o

class MyEventOne extends Event implements MyEventInterface 

Sonra EventServiceProvider içinde etkinliklerinizi ve dinleyicileri bağlamak ... Eğer bir dinleyiciye gibi senin kadar birçok geçebilir görünüyor

protected $listen = [ 
    'App\Events\MyEventOne' => [ 
     'App\Listeners\MyListener', 
    ], 
    'App\Events\MyEventTwo' => [ 
     'App\Listeners\MyListener', 
    ], 
]; 

Ve ... böylece nihayet ...

sözleşme/arayüzüne dayanan olay nesnesini kabul edecek işleyicisi ipucu yazın sizin dinleyici içinde
public function handle(MyEventInterface $event) 

Bunu bir birim test ettim, her senaryo için uygun olmayabilir, ancak çalışıyor gibi görünüyor. Umut ediyorum bu yardım eder.EventServiceProvider için

0

1- ekleyin:

SendNewMessageNotificationToRecipients.php üzerinde
php artisan event:generate 

3- (dinleyici):

use App\Events\Event; 
use App\Events\NewMessageSent; 
use App\Events\MessageReplied; 
use App\Events\MessageForwarded; 

public function handle(Event $event) 
{ 
    if ($event instanceof NewMessageSent) { 
     dd('message sent'); 
    } else if ($event instanceof MessageReplied) { 
     dd('message replied'); 
    } else if ($event instanceof MessageForwarded) { 
     dd('message forwarded'); 
    } 
}