Konstantin
А если в сервисе используется 2 шины, то bus1 и bus2 ?))
тогда уже да, называть по-разному
Konstantin
но в общем случае мне не хочется думать над названием переменной и во что она развернетс
Konstantin
я до компайлер-паса еще не дорос)
это гораздо проще, чем кажется. там будет 20 строк простого кода из туториала
Вадим
тогда уже да, называть по-разному
Может сразу придти к конвеншну $messageBus, $commandBus и код читабельнее ;)
Aleksander
Может сразу придти к конвеншну $messageBus, $commandBus и код читабельнее ;)
не, хочу диктатуру) чтобы быть уверенным, что туда не придёт другой сервис... а имена в любом случае можно писать осмысленно
Konstantin
он не читабельнее, это неявное соглашение, которое все разрабы обязаны соблюдать. назвал он свою переменную иначе - и все развалилось, даже ошибку не найдешь, просто твой сервис публикует в другую шину
Konstantin
и не факт что об этом через пять лет на кодревью вспомнят
Konstantin
в этом плане жестко прописанные типы гораздо понятнее и строже
Вадим
не, хочу диктатуру) чтобы быть уверенным, что туда не придёт другой сервис... а имена в любом случае можно писать осмысленно
не диктатура, тип то тоже нужно описать, а какая разница, какая имплементация придет.
Konstantin
тип очевиден, имя локальной переменной - нет
Aleksander
не диктатура, тип то тоже нужно описать, а какая разница, какая имплементация придет.
в данном случае суть не в имплементации даже - все шини одного класса. суть в том, что они для разного предназначены и типы тут только логического разделения
Konstantin
я выше лучше вариант предложил с тэгами
Aleksander
малёк неприятно что нельзя будет подсунуть базовый класс в чистом виде, но это решаемо - любую имплементацию можно обернуть в implement CommandBusInterface и всё будет как надо
Konstantin
я выше лучше вариант предложил с тэгами
декларативный, простой, широкораспространенный в мире симфони
Aleksander
https://symfony.com/doc/current/service_container/compiler_passes.html
спасибо! буду раскуривать
Вадим
я выше лучше вариант предложил с тэгами
Каким образом это решить тэгами?
Konstantin
Каким образом это решить тэгами?
тэггировать свои сервисы указанной шиной. чтобы избавить от этого знания класс сервиса, что снаружи пришло, туда и паблишим
Konstantin
- { name: bus.client, bus: events }
Konstantin
А если 2 шины нужно в сервисе?
- { name: bus.client, bus: events } - { name: bus.client, bus: app }
Вадим
- { name: bus.client, bus: events } - { name: bus.client, bus: app }
У вас в конструкторе 2 параметра, куда какую передавать? )
Konstantin
по порядку?
Konstantin
но да, проблема, согласен
Konstantin
надо для начала узнать, может ли у сервиса быть две шины по условиям задачи
Вадим
Зачем тогда с тэгами заморачиватся, если можно тупо в аргументы прописать? ) arguments: $bus1: '@messageBus' $bus2: '@commandBus'
Вадим
И явно, и не надо никакой код писать
Konstantin
я бы руками расставил в ямле
я изначально так и предлагал, да
Вадим
Я к тому что тэги не решают задачи.
Konstantin
да, перечитал тред, и правда. пойду дальше болеть)
Konstantin
слегка плохо соображаю)
Вадим
Потому я б делал через бинд )
Konstantin
так он не хочет описывать это в ямле, типа это поведение за пределы бандла пойдет
Konstantin
и клиентам бандла замучаешься объяснять что куда биндить. а так "укажи зависимостью FooBus и все заработает"
Konstantin
ну как я понял, по крайней мере
Aleksander
да, и кроме того, не хочется для каждого зависимого это делать(описывать в yaml)
Konstantin
тогда только прокси-классы
Konstantin
это максимально железобетонно
Вадим
так он не хочет описывать это в ямле, типа это поведение за пределы бандла пойдет
Описать 2-3 шины один раз, и все. Тут тоже самое написано, правда не через bind https://symfony.com/doc/current/service_container/autowiring.html#dealing-with-multiple-implementations-of-the-same-type
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
Описать 2-3 шины один раз, и все. Тут тоже самое написано, правда не через bind https://symfony.com/doc/current/service_container/autowiring.html#dealing-with-multiple-implementations-of-the-same-type
так шины то описаны - с этим ок. вопрос выбора нужной. и желательно по типу а не по имени переменной($shoutyTransformer)
Aleksander
Зачем наследовать, есть же декоратор
это тоже еще не в теме) можно подробнее/пример?
Вадим
это тоже еще не в теме) можно подробнее/пример?
https://gist.github.com/misterx/f861c6ac77ffcf3b117669b56807940a
Вадим
это тоже еще не в теме) можно подробнее/пример?
В ямле описываете только конструкторы к CommandBus и к EventBus, и можно привязывать код к этим классам
Вадим
это тоже еще не в теме) можно подробнее/пример?
Добавил в комент пример конфига на ямле. З.Ы. messenger компонент, сам создает бинд на аргументы по именам шин. https://symfony.com/doc/current/messenger/multiple_buses.html query.bus: autowireable with MessageBusInterface $queryBus;
Aleksander
Добавил в комент пример конфига на ямле. З.Ы. messenger компонент, сам создает бинд на аргументы по именам шин. https://symfony.com/doc/current/messenger/multiple_buses.html query.bus: autowireable with MessageBusInterface $queryBus;
хм. я правильно понимаю, что теперь "мои шины" не будут по сути шинами(без тега messenger.bus и вообще) а просто как обычный сервис с зависимостью в виде шины - верно?
Вадим
хм. я правильно понимаю, что теперь "мои шины" не будут по сути шинами(без тега messenger.bus и вообще) а просто как обычный сервис с зависимостью в виде шины - верно?
Не понял. Это два класса обертки над шинами, что б у каждой шины был свой класс, шины остаются которые и были )
Aleksander
Не понял. Это два класса обертки над шинами, что б у каждой шины был свой класс, шины остаются которые и были )
шины то остаются, но их уже нет в зависимостях напрямую - там уже только обёртка, которая уже не шина(без тега, в конструкторе без middlewares)
Aleksander
это я так, для понимания... в общем то вариант вроде ок. спасибо! пробую
Aleksander
ну типа это не системные шины, ты их не увидишь в контейнере с тегом messenger.bus то есть зависимые вещи, не будут зависеть от шины вообще, они просто зависят от "обычного" сервиса, который зависит от шины, но сам в системе как шина не фигурирует
Aleksander
но, вроде с виду, в этом ничего плохого нет)
Вадим
ну типа это не системные шины, ты их не увидишь в контейнере с тегом messenger.bus то есть зависимые вещи, не будут зависеть от шины вообще, они просто зависят от "обычного" сервиса, который зависит от шины, но сам в системе как шина не фигурирует
Почему не увидишь? ) Шины надо сначала всеравно описать в конфиге, и они должны существовать в системе. Весь смысл в том, что б существующую шину обернуть к конкретный класс, что бы работайл автовайринг.
Aleksander
Почему не увидишь? ) Шины надо сначала всеравно описать в конфиге, и они должны существовать в системе. Весь смысл в том, что б существующую шину обернуть к конкретный класс, что бы работайл автовайринг.
как шины, тут будут описаны всё те же command.bus / MessageBus а декораторы - уже не описываются таким образом - у них нет тега "messanger.bus" и, самое главное - ты им не сможешь middlewares прописать - их уже нет в конструкторе
Aleksander
то есть middleware прописываются всё так же к декорируемому MessageBus/command.bus
Aleksander
мидллвари прописываются в конфиге
да, но кому? где тут вход для middleware?
Вадим
да, но кому? где тут вход для middleware?
Туда уже передается шина с мидлварями )
Вадим
https://symfony.com/doc/current/messenger/multiple_buses.html возьмем шины из примера
Aleksander
Туда уже передается шина с мидлварями )
так и я про то же: то есть декроатор - уже не шина, в привычном понимани, которую можно сконфигурять как шину - уже низя... это просто сервис который зависит от шины... или я чего не того?)
Вадим
К шине command.bus прописываются миддлвари. Компонент автоматически создаст шину command.bus с мидлварями, мы берем эту готовую шину, и пихаем в декоратор
Aleksander
К шине command.bus прописываются миддлвари. Компонент автоматически создаст шину command.bus с мидлварями, мы берем эту готовую шину, и пихаем в декоратор
с этим понятно. но декоратор - просто от неё зависит, сам не являясь шиной... в общем это я для понимаю просто)
Вадим
с этим понятно. но декоратор - просто от неё зависит, сам не являясь шиной... в общем это я для понимаю просто)
Декоратор все вызовы, напрямую, передает в конкретную шину, и больше ничего )
Aleksander
Декоратор все вызовы, напрямую, передает в конкретную шину, и больше ничего )
это тоже понятно. но, при этом, только я знаю что он работает как шина - для системы(по конфигам framework.messenger.buses) - он уже не шина)))
Aleksander
и middleware ему отдельно уже тоже не подсунуть - только декорируемой "настоящей" шине
Вадим
это тоже понятно. но, при этом, только я знаю что он работает как шина - для системы(по конфигам framework.messenger.buses) - он уже не шина)))
Да. Можно использовать как сам класс для автовайринга, а можно как раньше конкретную шину передавать через ямл, и это будет одна и та же шина )
Aleksander
я про суть)
Вадим
я про суть)
Суть в том что это декоратор )
Aleksander
Суть в том что это декоратор )
вот и поговорили) я ж изначально об этом)
Вадим
вот и поговорили) я ж изначально об этом)
https://refactoring.guru/ru/design-patterns/decorator
Aleksander
типа если бы то же самой делалось проксёй, где сохранился бы конструктор с мидлварями, то это была бы полноценная шина, которую можно было бы сконфигурять отдельно именно как шину в framework.messenger