2016-07-13 2 views
0

Неправильная практика доступа к компоненту приложения из другого компонента? Если да: почему? Если нет: что было бы лучшей практикой? Я не нашел хорошего совета для этого вопроса в руководстве.Предложенный способ доступа к компоненту из другого компонента в Yii2?

ответ

1

Вы можете получить доступ к любому компоненту из любого места в вашем приложении через Yii::$app->componentName.

Но я не думаю, что это хорошая практика, чтобы сделать это прямо так.

По крайней мере, чтобы ваш компонент был изолирован, вы должны иметь в виду, что componentName является заданной конфигурацией приложения-операнда. Таким образом, вы должны указать имя ссылочного компонента в зависимую конфигурацию компонента.

В вашей components/MyComponent.php:

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

В config/web.php:

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

Таким образом, вы можете вызвать другую comonent в коде компонента, как это:

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

Но этот путь также не очень хорошо. В соответствии с принципом инверсии Depenency лучшим способом будет определение некоторой абстракции для ссылочного компонента (интерфейс для примера), который будет реализован в конфигурации родительского приложения. Но здесь я не могу дать ценный пример , потому что я не знаю вашей конкретной задачи и структуры приложения.

+0

Спасибо [@ maxim-korshunov] (http://stackoverflow.com/users/6479466) за подробный ответ. Полагаю, вы правы во всех отношениях. – twigmac

Смежные вопросы