@e-hot

Как сделать, чтобы по событию в методе одного сервиса с передачей параметра запускался другой сервис?

Приветствую.
Никогда ранее не приходилось использовать в проектах на SF2 функционал событий, теперь вынужден это сделать, но... Поизучал материалы в инете - жуть как вся эта тема описана и у каждого по-своему - не получилось собрать единую "картинку" виденья Events в SF2, поэтому, если кто в состоянии указать что можно сделать в следующей ситуации:
1. Сервис в одном из своих методов по факту конкретного условия if должен сделать так, чтобы запустился метод другого сервиса с одним параметром из текущего. Ключевое слово - ЗАПУСТИЛСЯ - типа как будто сам. Понятно, что можно просто тупо запустить тот самый метод нужного сервиса, обратившись к нему из текущего метода, но тогда текущий метод текущего сервиса закончит работу только по факту окончания работы того запущенного метода нужного сервиса - а это мне не нужно, необходимо, чтобы запущенный другой процесс шел параллельно и "независимо" от текущего.
2. Другими словами - напрашивается ловля нужного события в системе, взятие параметра и запуск некого процесса в качестве сервиса с использованием переданного параметра.
3. Пока понял, что в методе текущего сервиса нужно прописать создание события, а запускающийся сервис будет являться слушателем или подписчиком - сервис надо так же превратить в слушателя. Обязательно ли создавать класс-слушатель и т.д.?
Кто может, разъясните этот весь процесс.
Заранее спасибо.
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 1
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Поизучал материалы в инете - жуть как вся эта тема описана и у каждого по-своему - не получилось собрать единую "картинку"

Не надо никаких материалов в интернете. Есть официальная документация, которая нормально описывает суть работы событий в Symfony.
Сервис в одном из своих методов по факту конкретного условия if должен сделать так, чтобы запустился метод другого сервиса с одним параметром из текущего.

Что мешает вызвать из сервиса A сервис B?
Ключевое слово - ЗАПУСТИЛСЯ - типа как будто сам.

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

Если вы вызовете событие, произойдёт ровно то же самое. Параллельное выполнение имеет мало общего с исключениями.
Пока понял, что в методе текущего сервиса нужно прописать создание события, а запускающийся сервис будет являться слушателем или подписчиком - сервис надо так же превратить в слушателя. Обязательно ли создавать класс-слушатель и т.д.?

Вам вообще по тому как вы описали события не обязательно использовать. Но если будете - нужно будет делать EventListener или EventSubscriber. Читайте документацию.

А вообще, ВОЗМОЖНО, вам нужны очереди. То есть, можно посмотреть в сторону RabbitMQ, ZeroMQ и т.п. Суть будет такая:
У вас есть сервер очередей и пул воркеров, которые постоянно опрашивают сервер очередей на предмет новых заданий.
В вашем коде на PHP сервис отправляет сообщение серверу очередей с параметрами задания и продолжает делать свою работу. В это же время один из воркеров пула получает это задание и начинает его обрабатывать. Но это всё происходит не в рамках одной сессии приложения Symfony, а грубо говоря, работают два отдельных приложения, которые связаны через сервер очередей: ваше приложение на Symfony, которое отправляет задание в очередь и воркер(ы), которые обрабатывают очередь (вообще могут быть написаны на другом языке).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы