За последние 24 часа нас посетили 17880 программистов и 1569 роботов. Сейчас ищут 1247 программистов ...

Недопонимание event в laravel authentication

Тема в разделе "Laravel", создана пользователем виталий032, 2 ноя 2017.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Смотрю трейт RegistersUsers в глубинах vendor-a и метод register().
    Вот он:
    PHP:
    1. public function register(Request $request)
    2.     {
    3.         $this->validator($request->all())->validate();
    4.  
    5.         event(new Registered($user = $this->create($request->all())));
    6.  
    7.         $this->guard()->login($user);
    8.  
    9.         return $this->registered($request, $user)
    10.                         ?: redirect($this->redirectPath());
    11.     }
    Создается event, но как я понял полезного он ничего не делает и listener-а у него нет.

    Вот он Registered event:
    PHP:
    1. class Registered
    2. {
    3.     use SerializesModels;
    4.  
    5.     /**
    6.      * The authenticated user.
    7.      *
    8.      * @var \Illuminate\Contracts\Auth\Authenticatable
    9.      */
    10.     public $user;
    11.  
    12.     /**
    13.      * Create a new event instance.
    14.      *
    15.      * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
    16.      * @return void
    17.      */
    18.     public function __construct($user)
    19.     {
    20.         $this->user = $user;
    21.     }
    22. }
    Более того, если в трейте RegisterUsers закомментить создание event-а, то регистрация тоже успешно проходит:
    PHP:
    1. public function register(Request $request)
    2.     {
    3.         $this->validator($request->all())->validate();
    4.  
    5.         //event(new Registered($user = $this->create($request->all())));
    6.  
    7.         $user = $this->create($request->all());
    8.         $this->guard()->login($user);
    9.  
    10.         return $this->registered($request, $user)
    11.                         ?: redirect($this->redirectPath());
    12.     }
    Я не понимаю, зачем в трейте event();
    На будущее, чтобы пользователь laravel мог в EventServiceprovider прописать listener?
    PHP:
    1. protected $listen = [
    2.     'Illuminate\Auth\Events\Registered' => [
    3.         'App\Listeners\LogRegisteredUser'
    4. ];
     
    #1 виталий032, 2 ноя 2017
    Последнее редактирование: 2 ноя 2017
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Event и не должен делать ничего полезного - это просто событие, в данном случае событие создания нового пользователя. Будете вы как-то на него реагировать или нет - уже ваше дело, просто оно есть.
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    То есть можно смело удалять, если не никак не нужно реагировать на него?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Файлы которые лежат в vendors/ редактировать не стоит.
     
    Walk нравится это.
  5. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Тогда в контроллере RegisterController буду использовать трейт RegistersUsers, переопределять метод register(), только без event():)
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Тебе что, мешает сильно? Это никак не сказывается на производительности на современной машине, но даёт возможность в будущем навесить всякого-разного на регистрацию пользователя.
     
  7. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Нет, не мешает, просто первый раз столкнулся с event и listeners и непонятно в каких случаях они пригодятся.
    Если делаем однотипные задачи в конкретный момент выполнения кода, то можно создать .php файл и инжектировать его в нужную функцию.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    На одно событие можно повесить нескольких слушателей, таким образом разделив логику на несколько классов (т.е. в каждом из классов будет сосредоточено что-то одно, поэтому проще найти ошибку). Потом, можно со временем довешивать слушателей при расширении, не меняя код этого трейта. Достигается расширяемость. С другой стороны, есть противники архитектуры, основанной на событиях, утверждающие, что использование событий делает логику слишком нелинейной. Я не разделяю эту точку зрения, и использую события в своём коде, но ограниченно. Если ими злоупотреблять, то действительно потеряешь нить.
     
    виталий032 нравится это.
  9. mlatypowa

    mlatypowa Новичок

    С нами с:
    19 дек 2017
    Сообщения:
    2
    Симпатии:
    0
    Куда ложить классы: Filters и ThreadFilters ?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @mlatypowa, а что они делают. Вообще, куда угодно.