Использование yii\web\Session в DI

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

Использование yii\web\Session в DI

Сообщение Byakuya »

Здравствуйте, коллеги.

Есть класс, внутри которого используется yii\web\Session
Сам класс выглядит примерно так

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

class MyClass
{
    private $session;
    public function __construct(yii\web\Session $session)
    {
        $this->session = $session;
    }
}
свой класс я регистрирую в bootstrap функции так:

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

    public function bootstrap($app): void
    {
        $container = \Yii::$container;
        $container->setSingleton(MyClass::class, [
            $app->get('session')
        ]);
    }
Вся эта конструкция работает, но в логах я вижу warning: "Session is already started"
Подскажите, пожалуйста, я что-то делаю не так или это норм и на warning можно не обращать внимания?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Использование yii\web\Session в DI

Сообщение yiiliveext »

Сейчас yii2 не умеет компоненты резолвить в конструкторе, поэтому создается новый объект.
Byakuya
Сообщения: 41
Зарегистрирован: 2011.04.23, 21:22

Re: Использование yii\web\Session в DI

Сообщение Byakuya »

yiiliveext писал(а): 2020.03.07, 21:50 Сейчас yii2 не умеет компоненты резолвить в конструкторе, поэтому создается новый объект.
Понял, спасибо.

Решил вопрос заменой yii\web\Session $session на \ArrayAccess $session
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Использование yii\web\Session в DI

Сообщение yiiliveext »

А надо было создать SessionInterface и забиндить на него Yii::$app->getSession() в бутсрапе.
Byakuya
Сообщения: 41
Зарегистрирован: 2011.04.23, 21:22

Re: Использование yii\web\Session в DI

Сообщение Byakuya »

yiiliveext писал(а): 2020.03.12, 13:19 А надо было создать SessionInterface и забиндить на него Yii::$app->getSession() в бутсрапе.
Тогда придется еще делать свой класс сессии, реализующий интерфейс SessionInterface, наследовать его от yii\web\Session, прописывать его в конфигах приложения. Как-то много всего получается, учитывая что в своем компоненте с сессией я обращаюсь как с массивом и \ArrayAccess мне вполне подходит.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Использование yii\web\Session в DI

Сообщение yiiliveext »

Byakuya писал(а): 2020.03.13, 21:02 Тогда придется еще делать свой класс сессии, реализующий интерфейс SessionInterface, наследовать его от yii\web\Session, прописывать его в конфигах приложения. Как-то много всего получается, учитывая что в своем компоненте с сессией я обращаюсь как с массивом и \ArrayAccess мне вполне подходит.
Не так уж много. Но если вам разово - то пофиг.
А если постоянно будете DI юзать вместо сервис-локатора, то создаете пакет с интерфейсами и обертками для core components и юзаете в своих проектах.
Ответить