Представил
В последней статье реализована запись доступа пользователей, которая имеет дефектный дизайн и тесно связана с промежуточным программным обеспечением. Если для последующей модификации требуется не только записать ip, город, но и записать данные в новую таблицу данных или нужна другая статистика, то неразумно постоянно увеличивать и изменять код. В это время для обработки можно использовать событие/прослушиватель Laravel. Код смотрит на GitHub.
Событие/слушатель
События Laravel предоставляют простую реализацию шаблона наблюдателя, которая позволяет подписываться на события в вашем приложении и прослушивать их.
Шаблон наблюдателя иногда называют шаблоном публикации/подписки, который используется для реализации функций публикации/подписки для объектов: как только состояние объекта-субъекта изменяется, связанный объект-наблюдатель получает уведомления и выполняет соответствующие операции.
Выше приведено краткое описание шаблонов события/слушателя и наблюдателя. В сочетании с пониманием этого требования, когда запускается Доступ пользователя Событие, его Наблюдатель Обработка. Наблюдателей может быть несколько, и в этом примере выполняется только складская операция.
Создать событие/прослушиватель
оставайтесь приложение/Провайдеры/EventServiceProvider. php Добавьте событие/прослушиватель в файл следующим образом
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
'App\Events\UserBrowse' => [
'App\Listeners\CreateBrowseLog',
// Other monitors
],
];После добавления выполните событие php artisan:сгенерируйте Соответствующее событие/прослушиватель создается автоматически. Создано отдельно app/Events/UserBrowse.php и app/Listeners/CreateBrowseLog.php Два файла.
Код реализации
Сосредоточьтесь на событиях app/Events/UserBrowse.php Файл, в котором вам необходимо получить данные для последующей обработки, код выглядит следующим образом
public $ip_addr;
public $request_url;
public $city_name;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($ip_addr, $request_url, $city_name)
{
$this->ip_addr = $ip_addr;
$this->request_url = $request_url;
$this->city_name = $city_name;
}Потом есть монитор. app/Listeners/CreateBrowseLog.php Что нам нужно здесь сделать, так это поместить данные, полученные в ходе события, в библиотеку. Код выглядит следующим образом
/**
* Handle the event.
*
* @param UserBrowse $event
* @return void
*/
public function handle(UserBrowse $event)
{
$log = new \App\Models\BrowseLog();
$log->ip_addr = $event->ip_addr;
$log->request_url = $event->request_url;
$log->city_name = $event->city_name;
$log->save();
}События распространения
Последнее, что нужно, – это распространять события и изменять их. app/Http/Middleware/BrowseLog.php Код промежуточного программного обеспечения изменен следующим образом
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Use Event/Listener to Store
event(new UserBrowse($request->getClientIp(), $request->path(), get_city_by_ip(false, 'null')));
return $next($request);
}После теста проблем не возникает.
эпилог
Эта модификация, с точки зрения сенсорики, заключается в передаче складской операции от промежуточного программного обеспечения к слушателю. На самом деле, смысл гораздо больше, чем это. Например, одно и то же событие может быть распространено в разных местах; события добавляют требования, просто нужно добавить слушателя; слушатели также могут использовать очереди и так далее.
Список литературы: События, Модель Наблюдателя.