我有一个库,我想用它作为组件。在配置文件中,我这样设置:
'components' => [
'superLib' => [
'class' => 'SuperLib'
// '__construct' => [$first, $second] Maybe Yii 2 have property for this
],
],
如何将数据传递给__construct()
?
大多数时候,您不必覆盖__construct()
。
Yii2中几乎所有的对象都是由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还引入了一个重要的对象初始化生命周期。特别是,创建Object或其派生类的实例将涉及以下内容生命周期顺序:
- 调用类构造函数
- 根据给定的配置初始化对象属性
- 则调用CCD_ 4方法
在上面的例子中,第2步和第3步都出现在类的末尾构造函数。建议您执行对象初始化在
init()
方法中,因为在那个阶段,对象配置已应用。为了确保上述生命周期,如果Object的子类需要重写构造函数,应该像以下内容:
public function __construct($param1, $param2, ..., $config = [])
{
...
parent::__construct($config);
}
也就是说,
$config
参数(默认为[]
)应声明为构造函数的最后一个参数,以及父实现应该在构造函数的末尾调用。
然而,如果你想在__construct
中使用额外的参数,你可以这样做:
'components' => [
'superLib' => [
'class' => 'app'components'SuperLib',
['firstParamValue', 'secondParamValue'],
],
],
你可以在第三个例子的官方文档中找到它。
使用__construct()
而不是__contruct
作为配置密钥:
'components' => [
'superLib' => [
'class' => namespace'of'SomeClass::class
'__construct()' => [$first, $second],
],
],