在EventServiceProvider.php
中注册一个event-listener-combo后,运行php artisan event:list
时会显示两个侦听器:
+-----------------------------------+-------------------------------------------------------------+
| Event | Listeners |
+-----------------------------------+-------------------------------------------------------------+
| App\Events\VillageCreated | App\Listeners\VillageInitializer@handle |
| | App\Listeners\VillageInitializer |
| Illuminate\Auth\Events\Registered | Illuminate\Auth\Listeners\SendEmailVerificationNotification |
+-----------------------------------+-------------------------------------------------------------+
我还不确定如何处理@handle
部分,因为该部分尚未注册。
这是侦听器:
<?php
namespace App\Listeners;
use App\Events\VillageCreated;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class VillageInitializer
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param VillageCreated $event
* @return void
*/
public function handle(VillageCreated $event)
{
//
dd('Hello');
$initBuildings = \App\Building::where('min_level', '>', 0)->get();
$event->village->buildings()->attachMany($initBuildings);
}
}
这对触发事件有影响吗?
答案 0 :(得分:2)
@handle
侦听器来自Laravel的Event Discovery,默认情况下已禁用。
即使event:list
uses event discovery似乎被禁用,但这些监听器实际上不会触发。请注意,我实际上并未对此进行测试,因此建议您在handle
方法内向日志添加一个条目(并删除dd
),然后手动触发事件,并检查日志中是否只有一个条目。
或者,您可以启用事件发现功能并删除EventServiceProvider
中的手动注册。
更新:由于Laravel使用反射方式扫描所有侦听器,建议使用php artisan event:cache
将侦听器缓存在生产环境中。
此问题有a closed bug。我添加了一条评论,以确认是否已正确关闭。