В Laravel/Lumen после какого-то события можно вызвать нужную логику. Это очень удобно, когда нужно сохранить код чистым и разбить его на мелкие логические кусочки, которые легче читать и понять, соответственно и поддерживать.
Например, после редактирования пользователя вызвать событие UserAfterUpdate, к которому могут подписаться разные слушатели. Аналогом такой системы является всем известная Jquery.on(‘event’);
Допустим есть сервис UserService::update
1 2 3 4 5 6 7 8 |
public function update() { // очень много кода здесь // Здесь мы хотим вызвать событие return true; } |
Нужно, во-первых, создать событие в папке app/events, если папки нету, то создайте ее вручную
Создать класс, например, UserAfterUpdateEvent. Это контейнер, в которую передаются данные из сервиса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Events; class UserAfterUpdateEvent { /** * @var array */ public $some_data; public function __construct(array $some_data) { $this->some_data = $some_data; } } |
Создать в папке app/Listeners слушателя, например SendEmailToUsers. Обязательный метод в нем handle()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Listeners; use App\Events\UserAfterUpdateEvent; class SendEmailToUsers { public function handle(UserAfterUpdateEvent $event) { $some_data = $event->some_data; echo "Emails {$some_data['message']}" . '<br>'; } } |
Зарегистрировать событие и слушателя в классе \App\Providers\EventServiceProvider::$listen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... namespace App\Providers; ... class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ UserAfterUpdateEvent::class => [ SendEmailToUsers::class ] ]; } |
Раскомментировать вызов событий в app.php $app->register(App\Providers\EventServiceProvider::class);
Запустить событие с помощью функции event. Я, для простоты, запустил его прямо в контроллера, хотя его можно в любом месте
1 2 3 4 5 6 7 8 9 10 11 |
class Controller extends BaseController { public function index() { event(new UserAfterUpdateEvent(['message' => 'sent'])); return "Hello world"; } } |
Теперь при обращении в нашему контроллеру вызывается событие