我有一个我想用作组件的库。在配置文件中我这样设置:
'components' => [
'superLib' => [
'class' => 'SuperLib'
// '__construct' => [$first, $second] Maybe Yii 2 have property for this
],
],
如何将数据传递给
__construct()
?
大多数时候你不必重写
__construct()
.
几乎 Yii 2 中的每个对象都是从 yii ase\Object 扩展的,它通过配置数组功能具有赋值属性。
Components 是从 yii ase\Component 扩展的,后者也是从
yii\base\Object
扩展的。所以在你的例子中连同类名(注意你应该提供完整的类名和命名空间,而在你的例子中它在根命名空间中)你可以传递任何属性/值对:
'components' => [
'superLib' => [
'class' => 'SuperLib'
'firstProperty' => 'firstPropertyValue',
'secondProperty' => 'secondPropertyValue',
],
],
有时您需要使用 init() 方法(例如检查值是否具有有效类型并抛出某种异常,设置默认值等):
public function init()
{
parent::init(); // Call parent implementation;
...
}
这里有一些来自官方文档的有用信息:
Object除了property特性外,还引入了一个重要的 对象初始化生命周期。特别是,创建一个新的 Object或其派生类的实例将涉及以下内容 生命周期顺序:
- 调用类构造函数;
- 对象属性根据给定的配置进行初始化;
- 调用
方法。init()
在上面,第 2 步和第 3 步都发生在课程结束时 构造函数。建议您执行对象初始化 在
方法中,因为在那个阶段,对象配置 已经申请了。init()
为了保证上面的生命周期,如果Object的子类 需要覆盖构造函数,应该像 以下:
public function __construct($param1, $param2, ..., $config = [])
{
...
parent::__construct($config);
}
也就是说,一个
参数(默认为$config
)应该声明为 构造函数的最后一个参数,以及父实现 应该在构造函数的末尾调用。[]
如果仍然想在
__construct
中使用额外的参数,你可以这样做:
'components' => [
'superLib' => [
'class' => 'app\components\SuperLib',
['firstParamValue', 'secondParamValue'],
],
],
你可以在官方文档here第三个例子中找到它。
使用
__construct()
代替__contruct
作为配置键:
'components' => [
'superLib' => [
'class' => namespace\of\SomeClass::class
'__construct()' => [$first, $second],
],
],