预见到从Yii2中的另一个组件访问组件的方法?

时间:2016-07-13 08:34:59

标签: yii2

从其他组件访问应用程序组件是不是一种不好的做法?如果是的话:为什么?如果不是:这样做的最佳做法是什么?我在指南中没有找到任何关于这个问题的好建议。

1 个答案:

答案 0 :(得分:1)

您可以通过Yii::$app->componentName从应用程序的任何位置访问任何组件。

但我不认为直接以​​这种方式做这是一个好习惯。

至少,为了保持组件的隔离,您应该记住componentName是一个主题op父应用程序配置。 因此,您应该将引用组件的名称包含在依赖组件配置中。

components/MyComponent.php

class MyComponent extends Component
{
  public $referencedComponentName = 'defaultName';
  ...
}

config/web.php

...
components => [
  'myComponent' => [
    ...
    'referencedComponentName' => 'otherComponent'
  ]
]

因此,您可以在组件代码中调用其他组件,如下所示:

use yii;
...
class MyComponent extends Component
{
  ...
  public function getReferencedComponent()
  {
    return \Yii::$app->get($this->referencedComponentName);
  }

但这种方式也不是很好。根据SOLID Depenency inversion原则,更好的方法是定义一些抽象 引用的组件(例如接口),它将在父应用程序配置中实现。但在这里,我无法提供有价值的例子 因为我不知道你的特定任务和申请结构。