Компонент Yii2 передает данные в __construct

У меня есть lib, который я хочу использовать в качестве компонента. В файле конфигурации я задал его так:

'components' => [ 'superLib' => [ 'class' => 'SuperLib' // '__construct' => [$first, $second] Maybe Yii 2 have property for this ], ], 

Как передать данные в __construct() ?

В большинстве случаев вам не нужно переопределять __construct() .

Практически каждый объект в Yii 2 расширен из yii \ base \ Object, который имеет свойства присваивания через конфигурационный массив.

Компоненты расширены из yii \ base \ Component , последний распространяется и от yii\base\Object . Итак, в вашем примере вместе с именем класса (обратите внимание, что вы должны предоставить полное имя класса с пространством имен, в то время как в вашем примере оно находится в корневом пространстве имен), вы можете передать любые пары свойств / значений:

 'components' => [ 'superLib' => [ 'class' => 'SuperLib' 'firstProperty' => 'firstPropertyValue', 'secondProperty' => 'secondPropertyValue', ], ], 

Иногда вам нужно использовать метод init () (например, для проверки того, имеют ли значения допустимые типы и выбрасывают какие-то исключения, для установки значений по умолчанию и т. Д.):

 public function init() { parent::init(); // Call parent implementation; ... } 

Вот некоторая полезная информация из официальных документов:

Помимо свойства свойства, Object также вводит важный жизненный цикл инициализации объекта. В частности, создание нового экземпляра объекта или его производного класса будет включать следующие жизненные циклы последовательно:

  • вызывается конструктор класса;
  • свойства объекта инициализируются в соответствии с данной конфигурацией;
  • вызывается метод init() .

В приведенном выше примере оба этапа 2 и 3 встречаются в конце конструктора классов. Рекомендуется инициализировать объект в методе init() потому что на этом этапе уже применяется настройка объекта.

Чтобы обеспечить вышеуказанные жизненные циклы, если дочерний класс объекта должен переопределить конструктор, это должно быть выполнено следующим образом:

 public function __construct($param1, $param2, ..., $config = []) { ... parent::__construct($config); } 

То есть параметр $config (по умолчанию [] ) должен быть объявлен последним параметром конструктора, а родительская реализация должна быть вызвана в конце конструктора.

Если вы все же хотите использовать дополнительные параметры в __construct вы можете сделать это следующим образом:

 'components' => [ 'superLib' => [ 'class' => 'app\components\SuperLib', ['firstParamValue', 'secondParamValue'], ], ], 

Вы можете найти его в официальных документах здесь в третьем примере.