Слушатель событий Laravel / Lumen не слушает

У меня есть класс контроллера 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, это также должно работать без этого.

И да, пространства имен установлены правильно. И нет, я не хочу использовать Фасады.

2

Решение

В bootstrap / app.php в разделе «Регистрация поставщиков услуг» закомментируйте регистрацию поставщика услуг.

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

в

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

Другие решения

Я думаю, что у меня уже есть эта проблема, вот как я решаю это:

В вашем 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'
]
];
}
0

Итак, похоже, что событие прослушивается только при использовании \Illuminate\Contracts\Event\Dispatcher в контроллере. я использовал \Illuminate\Events\Dispatcher, Я не знаю, почему это так, но это сработало.

0

У меня была похожая проблема при работе с Lumen и слушателями событий. Запущенное событие никогда не доходило до моего обычного слушателя, и я боролась целый день, чтобы выяснить, в чем проблема.

В конце я выяснил, что у меня была неправильная подпись handle метод на моем слушателе. Это была моя ошибка, но Dispatcher не уведомил меня об этой проблеме. Когда я изменил метод, чтобы принимать данные аргументы, он просто начал работать.

Я думаю, что проблема заключается в Illuminate\Events\Dispatcher в fire метод. функция call_user_func_array возвращает false, если сигнатура метода неверна, но диспетчер просто выходит из цикла при ошибке. И не уведомляет пользователя о проблеме.

0
По вопросам рекламы [email protected]