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