Yii2组件将数据传递给__construct

时间:2015-03-18 18:12:23

标签: php yii yii2

我有一个我想用作组件的库。在配置文件中,我将其设置为:

'components' => [
    'superLib' => [
        'class' => 'SuperLib'
         // '__construct' => [$first, $second] Maybe Yii 2 have property for this 
    ],
],

如何将数据传递到__construct()

1 个答案:

答案 0 :(得分:5)

大多数情况下,您不必覆盖__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还引入了一个重要的功能   对象初始化生命周期。特别是,创造一个新的   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中找到它。