Yii2 组件传递数据给 __construct

问题描述 投票:0回答:2

我有一个我想用作组件的库。在配置文件中我这样设置:

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

如何将数据传递给

__construct()

php yii yii2
2个回答
7
投票

大多数时候你不必重写

__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第三个例子中找到它。


0
投票

使用

__construct()
代替
__contruct
作为配置键:

'components' => [
    'superLib' => [
        'class' => namespace\of\SomeClass::class
         '__construct()' => [$first, $second],
    ],
],
© www.soinside.com 2019 - 2024. All rights reserved.