因此,根据laravel事件doc,在定义侦听器时,它可以在handle方法中接收事件实例并执行任何必要的逻辑:
public function handle(FoodWasPurchased $event)
因此,如果我的 FoodWasPurchased 事件定义如下(假设设置了EventServiceProvider):
public function __construct(Food $food)
{
$this->food = $food;
}
我可以通过执行以下操作从侦听器访问 $ food :
$event->food->doSomething();
但现在我的问题是如果听众听多个事件会怎么样?
Event FoodWasPurchased -> Listener Bill
Event DrinksWasPurchased -> Listener Bill
我现在所做的是我没有在侦听器句柄方法中指定事件实例:
public function handle($event)
我可以稍后使用if条件来检查$ event中收到的内容:
if (isset($event->food)) {
// Do something...
} elseif (isset($event->drinks)) {
// Do something else...
}
我确信有更好的方法。
或者最佳做法是确保一个侦听器只侦听一个单个事件?
答案 0 :(得分:19)
您可以使用放置在Listeners文件夹中但能够收听多个事件的Event Subscribers来收听多个事件。
<?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\UserEventListener@onUserLogin'
);
$events->listen(
'App\Events\UserLoggedOut',
'App\Listeners\UserEventListener@onUserLogout'
);
}
}
答案 1 :(得分:7)
如果您的活动符合合同或界面,您似乎可以将任意数量的活动传递给听众......
class MyEventOne extends Event implements MyEventInterface
然后在EventServiceProvider中,您将事件和侦听器连接起来......
protected $listen = [
'App\Events\MyEventOne' => [
'App\Listeners\MyListener',
],
'App\Events\MyEventTwo' => [
'App\Listeners\MyListener',
],
];
最后在你的监听器中输入提示你的处理程序接受基于契约/接口的事件对象...
public function handle(MyEventInterface $event)
我已经对此进行了单元测试,它可能并不适用于所有情况,但它似乎有效。我希望它有所帮助。
答案 2 :(得分:5)
您也可以尝试这样的事情:
// 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;
}
}
然后在handle
侦听器方法中尝试这样的事情:
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
}
}
答案 3 :(得分:1)
1-添加到EventServiceProvider:
gcloud
2-生成事件和监听器:
'App\Events\NewMessageSent' => [
'App\Listeners\SendNewMessageNotificationToRecipients',
],
'App\Events\MessageReplied' => [
'App\Listeners\SendNewMessageNotificationToRecipients',
],
'App\Events\MessageForwarded' => [
'App\Listeners\SendNewMessageNotificationToRecipients',
],
3-在SendNewMessageNotificationToRecipients.php(监听器)上:
php artisan event:generate