Реализация интерфесов модуля через DI. Как правильно делать?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Реализация интерфесов модуля через DI. Как правильно делать?

Сообщение myks1992@mail.ru »

Всем привет!) У меня проект состоит из нескольких модулей... Не всегда получается модули сделать полностью независимыми. Поэтому приходится прибегать к абстракции вне модуля. Для этого я использую DI контейнер от Yii. В модуле, где есть абстракция делаю интерфейс, а в модуле, который реализует эту абстракцию реализую интерфес. Далее через DI создаю связь, как показано в документации. Всё работает, но у меня создается вопрос правильности...

Например, модуль организаций требует реализовать города для работы со связями, получение название города и так далее. В Bootstrap я прописываю зависимость интерфеса

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

$container->setSingleton(CityInterface::class, GeoCity::class);
А в самом модуле GEО, а именно модели GeoCity реализую этот интерфейс:

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

class GeoCity extends \yii\db\ActiveRecord implements CityInterface
{}
Однако я думаю, что это не совсем правильно так делать. Так как интерфейс одного модуля реализуется в другом... Может быть правильней вынести эту реализацию в само приложение? Если да, то куда выносить. Или это нормально, что интерфейс из одного модуля определяется в другом...

Не знаю на сколько понятно описал))
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Реализация интерфесов модуля через DI. Как правильно делать?

Сообщение maleks »

myks1992@mail.ru писал(а): 2019.05.15, 12:54 В Bootstrap я прописываю зависимость интерфеса
В бутстрап приложения же? Не в бутстрап модуля?

Модули существуют для переносимости кода. Это для решения вопроса надо ли в модуль функционал реализации интерфейса вынести или в код приложения положить.

С данной схемой не вижу проблем.
Внутрь одного модуля ложится интерфейс, от которого что то внутри модуля зависит. Зависимости в одном слое остались.

А другие внешние модули предоставят реализацию.
Yii2 universal module sceleton - for basic and advanced templates
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Реализация интерфесов модуля через DI. Как правильно делать?

Сообщение myks1992@mail.ru »

maleks писал(а): 2019.05.15, 14:55
myks1992@mail.ru писал(а): 2019.05.15, 12:54 В Bootstrap я прописываю зависимость интерфеса
В бутстрап приложения же? Не в бутстрап модуля?
Да) Бутстрап приложения...

Значит я все правильно делаю. Я просто думал, что это не совсем правильно из слоя в слой лезть реализовывать интерфейс) Ну тогда понял.

А ещё можете подсказать как вытащить из базы по связи HasMany последний статус? Что-то сижу не могу допереть)

Связь:

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

public function getStatuses()
    {
        return $this->hasMany(Yii::createObject(RequestStatus::class), ['request_id' => 'id']);
    }
Нужно вытащить последний тип статуса. Получается только первый

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

$this->statuses[0]->type
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Реализация интерфесов модуля через DI. Как правильно делать?

Сообщение maleks »

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

if ($statuses = $this->statuses) {
    $lastStatus = $statuses[count($statuses) - 1];
}
Yii2 universal module sceleton - for basic and advanced templates
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Реализация интерфесов модуля через DI. Как правильно делать?

Сообщение myks1992@mail.ru »

maleks писал(а): 2019.05.15, 15:59

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

if ($statuses = $this->statuses) {
    $lastStatus = $statuses[count($statuses) - 1];
}
Благодарю!)))))))))
Ответить