Почему прослушиватель событий не возвращает false

У меня какое-то событие Samevent.
Например, у моего события есть два слушателя;
$ result = event (новый Samevent ());
Я должен проверить результат;

1 ящик FirstListener возвращает ложь;
SecondListener возвращает ложь;
dd ($ result) = [];

2 кейс FirstListener возвращает ложь;
SecondListener возвращает истину;
dd ($ result) = [];

3 корпус FirstListener возвращает истину;
SecondListener возвращает ложь;
dd ($ result) = [true];

4 корпус FirstListener возвращает истину;
SecondListener возвращает истину;
dd ($ result) = [истина, истина];
Почему это происходит ?? Как я могу это исправить

События и слушатели работают не так. Таких результатов от слушателей не получить. В реальных примерах огромное количество событий запускается в отдельной очереди после завершения жизненного цикла запроса.

DevK 26.05.2018 20:05

Эти слушатели не помещаются в очередь

Davit 26.05.2018 20:42

@Davit Что вы думаете о вышеупомянутом вопросе? У вас есть четкие идеи? Если у вас есть, пожалуйста, поделитесь со мной. Спасибо.

Senthur 12.06.2020 12:06

@Dev Нет, у меня не было никаких новых мыслей по этому поводу

Davit 12.06.2020 17:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
4
430
2

Ответы 2

Если вам нужно получить результат от функции, вы не должны использовать систему событий для запуска этой функции.

Вы должны провести рефакторинг вашего кода одним из двух способов:

1) Прекратите использовать событие и используйте что-то вроде задания / взаимодействия без очереди.

$interaction = new Interaction;
$result = $interaction->handle($vars);

dd($result);

2) Передайте все необходимые переменные в событие, чтобы ваш слушатель мог выполнять любую обработку после события внутри самого слушателя.

Я должен использовать прослушиватель событий.

Davit 26.05.2018 21:33

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

Некоторые дополнительные сведения о том, почему вы считаете, что желаемая логика должна исходить от Слушателя, были бы полезны, возможно, мы сможем подсказать вам лучший образец. А пока я бы сказал, что у вас есть несколько вариантов. В порядке предпочтения:

  1. Преобразуйте содержимое метода handle() вашего слушателя в новый класс обслуживания. Класс, который, по вашему мнению, в настоящее время нуждается в доступе к этому прослушивателю, и сам прослушиватель могут затем ссылаться на этот класс службы независимо друг от друга.
  2. Не запускайте свой класс Listener из события. Вместо этого создайте его как обычный класс, а затем вызовите его метод handle() напрямую, чтобы получить желаемый ответ.
  3. Настройте config(['app.queue_driver' => 'sync']), чтобы слушатели запускались синхронно. (Обязательно измените его обратно в следующей строке после запуска прослушивателя, который должен быть синхронным, иначе это может иметь непредвиденные последствия для остальной части вашего приложения.) Затем измените свой прослушиватель, чтобы все handle() сохранялись в свойство, доступное с помощью нового метода Getter. Однако этот вариант не рекомендуется. Это может можно сделать, но он настолько небрежный, что я не решаюсь даже предлагать его. Но я не новичок в том, чтобы заставлять свой код делать странные вещи ради юнит-тестов, поэтому я не собираюсь предполагать, что знаю ваши обстоятельства.

Другие вопросы по теме