независимый модуль и как передать конфиг, сервисный слой и тд

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение caHek2x »

прошу направить меня на правильный путь )
пытаюсь адекватно отвязать модуль в независимый вынести его в гит и тд ...
возьмем некий модуль коммуникации
модуль из себя представляет просто линковку некого linkId с channelId + channelType с определенной бизнес логикой
каналы связи будут конфигурироваться, в этом и вопрос, куда класть конфиг
то есть в конфиг я буду передавать какие каналы связи могут быть, модель какую создавать и тд ...

Код: Выделить всё

'communicationChannels' => [
            [
                'id'       => ChannelTypes::PHONE,
                'name'     => 'Телефон',
                'dtoClass' => ChannelPhoneDto::class,
                ...
            ],
        ],
модуль в себе будет содержать сервисный слой (CommunicationService) где вся логика который и будет дергаться извне
так же в модуле будет набор виджетов для отображения и изменения

вот в чем проблема:
если я конфиг пропишу в модуле, как например это у gii прописывается то как мне в сервисном слое его юзать ведь модуль при подключении могут назвать как угодно (поэтому в сервисном слое я не могу написать getModule(...)) да или вообще он может быть не инициализирован если я не дергаю его контроллеры и bootstrap
я например буду вызывать его так в проекте к которому он подключается:

Код: Выделить всё

$communication = Yii::$container->get(CommunicationService::class);
думал насчет того что бы тогда конфиг этот прописывать у самого контейнера container => definitions но как то звучит не очень ...

думал может сервисный слой объявить как компонент и тогда конфигурировать компонент ... но будет далее но ...

у меня кроме сервисного слоя есть еще виджеты которые тоже должны знать о параметрах из конфига (communicationChannels) ...

может создать отдельный сервисный слой CommunicationSetting, мой модуль добавлять в bootstrap и при инициализации модуля параметры передавать в мой CommunicationSetting (Yii::$container->set()) и тогда я и из CommunicationService и из виджетов могу получать эти параметры обращаясь к CommunicationSetting, ну или раз уж добавляем в bootstrap я могу и CommunicationService там законфигрировать даже просто передав ему уже модуль ...

в какую сторону правильно думать ?)
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение caHek2x »

может чтоб не засовывать модуль в bootstrap тогда построить логику что если нужен CommunicationService то getModule(...)->getService()
и тогда модуль будет инициализироваться только тогда тогда я к нему обращусь и тд ... то как мне кажется теряется какаято простота и идем на усложнение, потеряв тем самым возможность DI этого CommunicationService т.к. я уже не смогу просто гдето в проекте дергать через конструктор его

хотя наверно так будет самое логичное и тогда мы будем иметь возможность этот модуль хоть 10 раз подключить и доставать сервисный слой именно нужного нам модуля ... но хотя опять вернемся к виджетам ... и тут загвоздка ...
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение SiZE »

A module represents a sub-application which contains MVC elements by itself, such as models, views, controllers, etc.
К модулю надо относится, как к отдельному приложению. А вы судя по всему пытаетесь просто создать обычный компонент для ServiceLocator.

Если модуль инициализирован (произошло обращение к контроллеру/команде в модуле), к нему всегда можно обратиться таким образом и получить нужный конфиг (id модуля и тп).

Код: Выделить всё

$module = MyModuleClass::getInstance();
// или
$module = \Yii::$app->controller->module;
да или вообще он может быть не инициализирован если я не дергаю его контроллеры и bootstrap
Вот в таком случае, модуль использовать бессмысленно, вам нужно реализовать yii\base\Component и обращаться к нему через заданный в конфиге компонентов идентификатор. Или же просто сконфигурировать сервис через Di в boostrap приложения и прокинуть его в экшен там где надо. Второй вариант предпочтительней. Особенно если вы не затащили в сервис ничего из \yii\*.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение caHek2x »

хорошо, выношу свой сервис как компонент, подключаю его в components, там же конфигурирую
в комплекте с моим "модулем" идут виджеты, они же не знают как я подключил компонент (название) но для отображения виджета ему нужно получить параметры которыми я сконфигурировал компонент
Разве что передавать в виджеи каждый раз компонент, хм возможно это решение
SiZE писал(а): 2024.02.12, 15:44 Или же просто сконфигурировать сервис через Di в boostrap приложения и прокинуть его в экшен там где надо. Второй вариант предпочтительней. Особенно если вы не затащили в сервис ничего из \yii\*.
это вы имеете ввиду один из вариантов что я озвучивал:
думал насчет того что бы тогда конфиг этот прописывать у самого контейнера container => definitions но как то звучит не очень ...
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение SiZE »

caHek2x писал(а): 2024.02.12, 16:10 в комплекте с моим "модулем" идут виджеты, они же не знают как я подключил компонент (название) но для отображения виджета ему нужно получить параметры которыми я сконфигурировал компонент
1. Модуль - это приложение.
2. Виджет - это часть представления.
3. Виджет ничего не знает о конфигурации каких бы то ни было классов.

Так себе вариант решения, но более простой для понимания:

Код: Выделить всё

'components' => [
    'communication' => [
        'class' => \app\modules\MyModule\Service\Communication::class,
        'communicationChannels' => [...],
    ],
],
'modules' => [
    'MyModule' => [
          'class' => app\modules\MyModule\Module::class,
          'communicationService' => 'communication',
    ]
],


// Module

/**
 * @var \app\modules\MyModule\Service\Communication|string|null
 */
private $communicationService;

public function init()
{
    $this->communicationService = Instance::ensure($this->communicationService, \app\modules\MyModule\Service\Communication::class);

   parent::init();
}
Последний раз редактировалось SiZE 2024.02.13, 07:37, всего редактировалось 1 раз.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение caHek2x »

значит едино верным решением будет виджету принимать компонент на вход, на основе которого он и отрендерит представление ... тогда он будет независим от никаких конфигов, что передали с тем и работает
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение caHek2x »

И ещё, делая компонент или модуль или что то подобное мы рассчитываем что наш компонент могут подключить несколько раз значит для каждого "дубликата" компонента должна быть разная таблица и ТД ... То есть в компонент по хорошему бы передавать название таблицы или префикс ... И как правильно это организовать (я про реализацию самой миграции) ? Или никак и компонент должен только принимать реализацию интерфейса и все ... ?!
Или делать миграцию абстрактную с требованием передать таблицу ... Наследуемся передаем запускаем и ТД ... Костыли какие-то придумываю ...
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: независимый модуль и как передать конфиг, сервисный слой и тд

Сообщение SiZE »

Если взять в качестве примера миграцию rbac, увидим обращение к компоненту и получение из компонента сведений о именах таблиц. Но в этой реализации заранее известен компонент.

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

Что делать? Самое простое добавить в README.md компонента пример миграции, создать шаблон миграции и так же добавить пример команды для генерации миграции.

Код: Выделить всё

yii migrate/create create_table1_table --template-file="@vendor/my/package/src/migration.php"
Название таблицы будет браться из названия миграции, как это по умолчанию делается, а структура жестко закреплена в шаблоне.
Ответить