У меня есть 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'], ], ],
Вы можете найти его в официальных документах здесь в третьем примере.