Почему Контейнер зависимостей не видит параметр в ассоциативном массиве?

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

Почему Контейнер зависимостей не видит параметр в ассоциативном массиве?

Сообщение MarkL »

Ошибка:
Exception 'yii\base\InvalidConfigException' with message 'Missing required parameter "location" when instantiating "shop\manage\payment\cloudPayments\CloudPaymentsPaymentCreator".'
Возникает при извлечении класса:

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

\Yii::$container->get($class, [], $params); // в $class - CloudPaymentsPaymentCreator
Конструктор класса CloudPaymentsPaymentCreator:

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

class CloudPaymentsPaymentCreator implements PaymentCreator
{
    const LOCATION_USA = "USA";
    const LOCATION_EU = "EU";

    private $location;

    public function __construct($location)
    {
        $this->location = $location;
    }

Распечатка $params

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

array(1) {
  ["location"]=>
  string(2) "EU"
}
----
Как видно: параметр "location" есть в массиве $params, но почему-то DI этого не видит. Что я делаю не так?
Аватара пользователя
MarkL
Сообщения: 68
Зарегистрирован: 2017.07.05, 20:37

Re: Почему Контейнер зависимостей не видит параметр в ассоциативном массиве?

Сообщение MarkL »

ElisDN писал(а): 2021.10.12, 15:02

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

Yii::$container->get($class, ['EU']);
Хотелось бы решить проблему, а не найти альтернативу :)

+Порядок параметров часто может меняться, сложнее отслеживать побочные эффекты, чем ассоциативный ключ, как по мне.
Аватара пользователя
MarkL
Сообщения: 68
Зарегистрирован: 2017.07.05, 20:37

Re: Почему Контейнер зависимостей не видит параметр в ассоциативном массиве?

Сообщение MarkL »

ElisDN писал(а): 2022.01.16, 20:51

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

\Yii::$container->get($class, $params);
Ошибка:

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

Exception 'yii\base\InvalidConfigException' with message 'Missing required parameter "location" when instantiating "shop\manage\payment\cloudPayments\CloudPaymentsPaymentCreator".'
$params:

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

array(1) {
  ["location"]=>
  string(3) "USA"
}
Конструктор CloudPaymentsPaymentCreator:

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

    private $location;

    public function __construct($location)
    {
        $this->location = $location;
    }
Аватара пользователя
MarkL
Сообщения: 68
Зарегистрирован: 2017.07.05, 20:37

Re: Почему Контейнер зависимостей не видит параметр в ассоциативном массиве?

Сообщение MarkL »

Но если предварительно использовать set(), то сработает самый первый вариант:

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

\Yii::$container->set($class, [], $params);
return \Yii::$container->get($class);
Ответить