Yii2组件将数据传递给__construct

Jac*_*ack 4 php yii yii2

我有一个我想用作组件的库.在配置文件中我设置它:

'components' => [
    'superLib' => [
        'class' => 'SuperLib'
         // '__construct' => [$first, $second] Maybe Yii 2 have property for this 
    ],
],
Run Code Online (Sandbox Code Playgroud)

我如何将数据传递给__construct()?

aro*_*hev 5

大多数时候你不必覆盖__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)

您可以在官方文档发现这里的第三个例子.