Странное поведение Request и Response

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
KEFIR4UK
Сообщения: 88
Зарегистрирован: 2014.12.13, 16:24

Странное поведение Request и Response

Сообщение KEFIR4UK » 2018.03.01, 10:59

Обнаружил странное повидение етих обектов если их вызывать с помощью DI:
- для объект Request не заполнятся поле parsers.
К примеру в настройке конфигурации :

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

 'request' => [
            'enableCookieValidation' => false,
            'parsers' => [
                'application/json' => yii\web\JsonParser::class,
            ],
        ],
И если в рестовом контроллере я подключаю Request через конструктор и обращаюсь к свойсту parsers - оно пустое, но если а обращаюсь как \Yii::app()->request->parsers все нормально.
- для объект Response аналогичная ситуация толкьо со свойством format.

Мжет кто то мне обяснить почему так происходит?

Nex-Otaku
Сообщения: 796
Зарегистрирован: 2016.07.09, 21:07

Re: Странное поведение Request и Response

Сообщение Nex-Otaku » 2018.03.01, 14:09

1. Вы путаете понятия. Для DI действительно можно определить "настройки по умолчанию" для классов, но это делается не через "config.php".

В настройках приложения определяются настройки для подключаемых в объекту приложения компонентов, то есть для конкретных объектов, припреплённых к объекту приложения, а не для всех объектов класса компонента.

2. Если вам хочется передать зависимость в конструктор, при этом абстрагироваться от фреймворка, передайте какой-нибудь RequestProvider.

Например:

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

class RequestProvider
{
    public function getRequest()
    {
        return \Yii::$app->request;
    }
}

KEFIR4UK
Сообщения: 88
Зарегистрирован: 2014.12.13, 16:24

Re: Странное поведение Request и Response

Сообщение KEFIR4UK » 2018.03.01, 14:27

На сколько я понимаю при вызове

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

 \Yii::$app->request
вызвается

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

/**
     * Returns the request component.
     * @return \yii\web\Request|\yii\console\Request the request component.
     */
    public function getRequest()
    {
        return $this->get('request');
    }
в yii\base\Application, в котором вызывается Yii::createObject, который в себе собирает обьект через DIC, сообственно результат должен быть одинаковый что при вызове обьекта через DI или через сервис локатор.

Nex-Otaku
Сообщения: 796
Зарегистрирован: 2016.07.09, 21:07

Re: Странное поведение Request и Response

Сообщение Nex-Otaku » 2018.03.01, 16:06

Нет, не так.

Приложение наследуется от класса ServiceLocator, который и осуществляет загрузку компонентов (в нашем случае "request") с заданной в нём же, то есть локаторе, конфигурацией (в нашем случае из файла "config.php").

Проще говоря, настройки из config.php прикреплены к объекту приложения (Application), и используются объектом приложения для создания объектов его же компонентов.

Вы же создаёте напрямую через DIC, минуя объект приложения, поэтому и настройки не подхватываются.

http://www.yiiframework.com/doc-2.0/gui ... cator.html

Если так будет понятнее, то объясню ещё по-другому:

1. Настройки в конфиге "config.php" привязаны к ID "request".
Запросив "request" мы получаем объект с настройками из "config.php".

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

$app->get('request')
2. Указывая зависимости в конструкторе, используя DIC, вы используете только имя класса.
ID автоматически созданного объекта будет по имени класса: "yii\web\Request".

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

$container->get('yii\web\Request')
так как ID не совпадает с "request", то разумеется он выдаст вам объект без настроек.

Ответить