Konstantin
Aleksander
Konstantin
но в общем случае мне не хочется думать над названием переменной и во что она развернетс
Konstantin
он не читабельнее, это неявное соглашение, которое все разрабы обязаны соблюдать. назвал он свою переменную иначе - и все развалилось, даже ошибку не найдешь, просто твой сервис публикует в другую шину
Konstantin
и не факт что об этом через пять лет на кодревью вспомнят
Konstantin
в этом плане жестко прописанные типы гораздо понятнее и строже
Konstantin
Вадим
Konstantin
тип очевиден, имя локальной переменной - нет
Вадим
Konstantin
я выше лучше вариант предложил с тэгами
Aleksander
малёк неприятно что нельзя будет подсунуть базовый класс в чистом виде, но это решаемо - любую имплементацию можно обернуть в implement CommandBusInterface и всё будет как надо
Aleksander
Вадим
Konstantin
Каким образом это решить тэгами?
тэггировать свои сервисы указанной шиной. чтобы избавить от этого знания класс сервиса, что снаружи пришло, туда и паблишим
Вадим
Konstantin
- { name: bus.client, bus: events }
Вадим
Konstantin
по порядку?
Konstantin
но да, проблема, согласен
Konstantin
надо для начала узнать, может ли у сервиса быть две шины по условиям задачи
Вадим
Зачем тогда с тэгами заморачиватся, если можно тупо в аргументы прописать? )
arguments:
$bus1: '@messageBus'
$bus2: '@commandBus'
Вадим
И явно, и не надо никакой код писать
Вадим
Я к тому что тэги не решают задачи.
Konstantin
да, перечитал тред, и правда. пойду дальше болеть)
Konstantin
слегка плохо соображаю)
Вадим
Потому я б делал через бинд )
Konstantin
так он не хочет описывать это в ямле, типа это поведение за пределы бандла пойдет
Konstantin
и клиентам бандла замучаешься объяснять что куда биндить. а так "укажи зависимостью FooBus и все заработает"
Konstantin
ну как я понял, по крайней мере
Aleksander
да, и кроме того, не хочется для каждого зависимого это делать(описывать в yaml)
Aleksander
Konstantin
тогда только прокси-классы
Konstantin
это максимально железобетонно
Aleksander
в общем создал наследника от MessageBus, но при попытке прописать в command.bus получаю ошибку:
Cannot replace arguments for class "TheSite\Base\Component\CommandBus" if none have been configured yet.
подебажил - это в MessengerPass он заменяет параметры-middleware's
как победить? что тут не так?
$services
->set('command.bus', CommandBus::class)
->args([]) // это я уже после ошибки добавил - не помогло
->tag('messenger.bus');
Вадим
Aleksander
Вадим
это тоже еще не в теме) можно подробнее/пример?
Добавил в комент пример конфига на ямле.
З.Ы. messenger компонент, сам создает бинд на аргументы по именам шин. https://symfony.com/doc/current/messenger/multiple_buses.html
query.bus: autowireable with MessageBusInterface $queryBus;
Aleksander
Вадим
Вадим
Aleksander
это я так, для понимания... в общем то вариант вроде ок. спасибо! пробую
Вадим
Aleksander
ну типа это не системные шины, ты их не увидишь в контейнере с тегом messenger.bus
то есть зависимые вещи, не будут зависеть от шины вообще, они просто зависят от "обычного" сервиса, который зависит от шины, но сам в системе как шина не фигурирует
Aleksander
но, вроде с виду, в этом ничего плохого нет)
Вадим
Вадим
Aleksander
то есть middleware прописываются всё так же к декорируемому MessageBus/command.bus
Вадим
Вадим
Вадим
https://symfony.com/doc/current/messenger/multiple_buses.html возьмем шины из примера
Aleksander
Туда уже передается шина с мидлварями )
так и я про то же: то есть декроатор - уже не шина, в привычном понимани, которую можно сконфигурять как шину - уже низя... это просто сервис который зависит от шины...
или я чего не того?)
Вадим
К шине command.bus прописываются миддлвари. Компонент автоматически создаст шину command.bus с мидлварями, мы берем эту готовую шину, и пихаем в декоратор
Вадим
Вадим
Aleksander
Вадим
Aleksander
и middleware ему отдельно уже тоже не подсунуть - только декорируемой "настоящей" шине
Вадим
Aleksander
я про суть)
Aleksander
типа если бы то же самой делалось проксёй, где сохранился бы конструктор с мидлварями, то это была бы полноценная шина, которую можно было бы сконфигурять отдельно именно как шину в framework.messenger