Laravel/Lumen事件侦听器不侦听


Laravel/Lumen event listener does not listen

我有一个Lumen控制器类,它在创建用户时触发事件。我正在使用事件调度程序。事件按其应有的方式被激发,但侦听器不处理该事件。我确信我已经遵循了Lumen文档的每一步。

// UserController.php
class UserController extends ApiController
{
     protected $event = null;
     public function __construct(Dispatcher $event)
     {
         $this->event = $event;
     }
    /**
     * Store a newly created resource in storage.
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request)
    {
         $this->acceptContentType($request, 'json');
         $this->input = $request->json()->all();
         $this->withEncryptedParameters();
         $this->validateParameterNames(array_keys($this->validationRules));
         $this->validateParameterContent($this->validationRules);
         $roles = $this->getRelationInput('roles');
         $user = User::create($this->input);
         $this->addRelation($user, $roles, Role::class, 'roles');
         $this->event->fire(new UserCreated($user));
         return $this->respondCreated($user->id);
     }
}

所以我基本上想把一个用户存储到数据库中,并在发生这种情况时触发一个事件。

// UserCreated.php
class UserCreated extends Event
{
    public $user;
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

事件被正确地激发,所以如果我在事件的构造函数中放入"echo"或"var_dump",我可以看到它是有效的。如果我对听众也是这样,它就不会做出反应。

// UserCreatedEmail.php
class UserCreatedEmail extends Listener
{
    public function handle(UserCreated $event)
    {
        echo 'Hello?';
    }
}

我已经在EventServiceProvider中注册了它。

// EventServiceProvider.php
class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        UserCreated::class => [
            UserCreatedEmail::class
        ]
    ];
}

并在引导区取消注释。

// bootstrap/app.php    
$app->register(WISSIT'UserService'Providers'EventServiceProvider::class);

我完全不知道为什么它不起作用。我可以使用"$event->listen",但当我使用测试时,它也会监听。根据Lumen的文件,它也应该在没有它的情况下工作。

是的,名称空间设置正确。不,我不想使用外墙。

在bootstrap/app.php中的"注册服务提供商"下注释掉服务提供商的注册。

// $app->register(App'Providers'EventServiceProvider::class);

进入

$app->register(App'Providers'EventServiceProvider::class);

我想我已经遇到了这个问题,所以这就是我解决这个问题的方法:

EventServiceProvider中,将事件类和侦听器类更改为真实路径,不要在EventServiceProvider中使用::class。I.e:

// EventServiceProvider.php
class EventServiceProvider extends ServiceProvider
{
   /**
    * The event listener mappings for the application.
    *
    * @var array
    */
    protected $listen = [
        'WISSIT'UserService'Events'UserCreated' => [
            'WISSIT'UserService'Listeners'UserCreatedEmail'
        ]
    ];
}

好的,所以看起来只有在控制器中使用'Illuminate'Contracts'Event'Dispatcher时才会侦听事件。我用的是'Illuminate'Events'Dispatcher。我不知道为什么会这样,但它起了作用。

我在使用Lumen和事件监听器时遇到了类似的问题。被解雇的事件从未到达我的自定义监听器,我花了一天的时间才弄清楚问题出在哪里。

最后,我发现我的侦听器上有一个错误的handle方法签名。这是我的错误,但Dispatcher没有通知我这个问题。当我更改方法以接受给定的参数时,它才刚刚开始工作。

我认为问题在于fire方法中的Illuminate'Events'Dispatcher。如果方法的签名错误,函数call_user_func_array将返回false,但调度器只是在出现错误时中断循环。并且不会将问题通知用户。