Laravel/Lumen 事件监听器不监听
Laravel/Lumen event listener does not listen
我有一个 Lumen 控制器 class,它会在创建用户时触发一个事件。我正在使用事件调度程序。该事件被触发,但监听器不处理该事件。
我确信我已经遵循了 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 区域取消注释。
// bootstrap/app.php
$app->register(WISSIT\UserService\Providers\EventServiceProvider::class);
我完全不知道为什么不起作用。我可以使用“$event->listen”,但是当我使用测试时它也会监听。根据 Lumen 文档,没有它也应该可以工作。
是的,命名空间设置正确。不,我不想使用 Facades。
我想我已经遇到了这个问题,所以这就是我解决这个问题的方法:
在您的 EventServiceProvider
中将事件 class 和侦听器 class 更改为真实路径,不要在 EventServiceProvider
中使用 ::class
。即:
// 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
。 Function call_user_func_array
returns 如果方法的签名错误,则为 false,但调度程序只是在出错时跳出循环。并且不通知用户有关问题。
在bootstrap/app.php下'Register Service Providers'注释掉注册服务商
// $app->register(App\Providers\EventServiceProvider::class);
进入
$app->register(App\Providers\EventServiceProvider::class);
我有一个 Lumen 控制器 class,它会在创建用户时触发一个事件。我正在使用事件调度程序。该事件被触发,但监听器不处理该事件。 我确信我已经遵循了 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 区域取消注释。
// bootstrap/app.php
$app->register(WISSIT\UserService\Providers\EventServiceProvider::class);
我完全不知道为什么不起作用。我可以使用“$event->listen”,但是当我使用测试时它也会监听。根据 Lumen 文档,没有它也应该可以工作。
是的,命名空间设置正确。不,我不想使用 Facades。
我想我已经遇到了这个问题,所以这就是我解决这个问题的方法:
在您的 EventServiceProvider
中将事件 class 和侦听器 class 更改为真实路径,不要在 EventServiceProvider
中使用 ::class
。即:
// 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
。 Function call_user_func_array
returns 如果方法的签名错误,则为 false,但调度程序只是在出错时跳出循环。并且不通知用户有关问题。
在bootstrap/app.php下'Register Service Providers'注释掉注册服务商
// $app->register(App\Providers\EventServiceProvider::class);
进入
$app->register(App\Providers\EventServiceProvider::class);