Использование сервис-локатора в Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
SaintRu
Сообщения: 88
Зарегистрирован: 2020.05.13, 11:22
Контактная информация:

Использование сервис-локатора в Yii2

Сообщение SaintRu »

Ищу совета опытных кодеров, в частности кто больше в DDD и SOLID
После написания проекта, вспомнил про принцип единственной ответственности, и что у себя в проекте, где ни попадя использовал сервис-локатор, а именно обращение к текущему пользователю \Yii:$app->user->identity.
В общем, сделал сервис:

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

class LoginService
{
    public function isGuest(): bool
    {
        return \Yii::$app->user->isGuest;
    }

    public function user():? User
    {
        if ($this->isGuest()) return null;
        $user = \Yii::$app->user->identity;
        if ($user instanceof User) return $user;
        throw new \DomainException('Ошибка класса User. Должен быть Frontend');
    }

    public function admin():? \booking\entities\admin\User
    {
        if ($this->isGuest()) return null;
        $user = \Yii::$app->user->identity;
        if ($user instanceof \booking\entities\admin\User) return $user;
        throw new \DomainException('Ошибка класса User. Должен быть Admin');
    }

    public function office():? \booking\entities\office\User
    {
        if ($this->isGuest()) return null;
        $user = \Yii::$app->user->identity;
        if ($user instanceof \booking\entities\office\User) return $user;
        throw new \DomainException('Ошибка класса User. Должен быть Office');
    }

    public function check():? \booking\entities\check\User
    {
        if ($this->isGuest()) return null;
        $user = \Yii::$app->user->identity;
        if ($user instanceof \booking\entities\check\User) return $user;
        throw new \DomainException('Ошибка класса User. Должен быть Check');
    }
 }
И в любом классе, который обращается к User, через конструктор с помощью контейнера зависимостей Yii2 этот сервис подгружается, например в контроллерах:

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

class ToursController extends Controller
{
    private $loginService;

    public function __construct(
        $id,
        $module,
        LoginService $loginService,
        $config = [])
    {
        parent::__construct($id, $module, $config);
        $this->loginService = $loginService;
    }
Или я сильно заморочился?
Единственный плюс, это теперь в классах понятно где какой используется User (в проекте это 4 независимых типа)
Вот думаю, стоит ли заморачиваться с респонсом и реквестом или это слишком?
Мой старт-ап ;) https://website39.site
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование сервис-локатора в Yii2

Сообщение samdark »

Или я сильно заморочился?
И да и нет. Да так как вы не используете то, что сделали. То есть там у вас не интерфейс и в тестах вы это дело не мокаете. Нет потому что так немного правильней. По крайней мере, явные зависимости.
Вот думаю, стоит ли заморачиваться с респонсом и реквестом или это слишком?
Смотря чего вы хотите этим добиться.
SaintRu
Сообщения: 88
Зарегистрирован: 2020.05.13, 11:22
Контактная информация:

Re: Использование сервис-локатора в Yii2

Сообщение SaintRu »

samdark писал(а): 2021.06.01, 21:59 И да и нет. Да так как вы не используете то, что сделали. То есть там у вас не интерфейс и в тестах вы это дело не мокаете. Нет потому что так немного правильней. По крайней мере, явные зависимости.
Да, тесты я упустил, но теперь во вьюшки уже прилетает сам user, а не как раньше вытаскиванием из сервис-локатора юзера в самой вьюшке, потом его свойства и т.п.:

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

return $this->render('view', [
	'user' => $loginServer->user(),
]);
samdark писал(а): 2021.06.01, 21:59 Смотря чего вы хотите этим добиться.
Пока даже не знаю, но проект разрастается, и из маленького агрегатора, уже превращается во что-то большое. И хочется все разложить, чтоб потом не бегать и не править код в тысячи файлах. Опыта больших проектов нет, поэтому все эти заморочки и переписывания.
Мой старт-ап ;) https://website39.site
Ответить