У меня есть класс контроллера 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
измените класс события и класс слушателя на реальный путь, не используйте ::class
в EventServiceProvider
, то есть:
// 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
не уведомил меня об этой проблеме. Когда я изменил метод, чтобы принимать данные аргументы, он просто начал работать.
Я думаю, что проблема заключается в Illuminate\Events\Dispatcher
в fire
метод. функция call_user_func_array
возвращает false, если сигнатура метода неверна, но диспетчер просто выходит из цикла при ошибке. И не уведомляет пользователя о проблеме.