2016-12-08 4 views
0

Я создал событие \ Listener, зарегистрировав пару в EventServiceProvider. После запуска php artisan generate: event Laravel создает классы Event и Listener в уважаемых каталогах.Понимание конструкторов для слушателей событий

Я заметил, что если вы хотите запустить событие, вам необходимо вызвать статический метод Event :: fire.

Event::fire(new SomeEventClass($variable)); 

Однако я заметил, что если вы хотите, чтобы передать $variable в Listener.

Вы должны объявить переменную $ в качестве государственной собственности класса и создать конструктор в классе Associated событий, так что вы можете использовать его в классе Слушатель, попозже проходя $variable из $event->variable, иначе $variable не будет работать в классе Listener.

class SomeEventClass extends Event { 

    use SerializesModels; 

    public $variable; 
    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct($variable) { 
     $this->variable = $variable; 
    } 

    /** 
    * Get the channels the event should be broadcast on. 
    * 
    * @return array 
    */ 
    public function broadcastOn() { 
     return []; 
    } 
} 

Так что, чтобы уточнить мой вопрос, что происходит под капотом, в этой ситуации.

ответ

1

Я не думаю, что здесь много чего происходит под капотом, это довольно прозрачный процесс.

Когда вы стреляете событие, Laravel будет искать все слушатель для этого события (через массив в EventServiceProvider классе) и передать класс событий для каждого слушателя он находит и вызвать handle метод на каждом слушателе.

Класс событий действительно делает только одно, он хранит данные для слушателей, которые в конечном итоге будут использоваться. Мы устанавливаем эти данные публично, потому что это создает очень простой способ для слушателей извлекать нужные данные из класса событий.