Init + Config = Troubles

всем привет

сорри, конечно за настойчивое не понимание, но все же

пытаюсь создать локальный для модуля конфиг: чтобы грузить нужные настройки из него

создал в модуле директорию config

в ней - файл config.php

содержание этого файла =


return array(


    'components'=>array(          


        'errorHandler' => array(

                'errorAction' => 'mymodule/controller/error'), 


    ), // end components   


);

подключил конфиг в init


$config = require dirname(__FILE__).DIRECTORY_SEPARATOR.'config/config.php';

$this->configure($config);

спецом вбрасываю исключение для проверки - сработает или нет обработчик ошибок из модуля = происходит облом

срабатывает ошибка приложения а не модуля

почему?

и есть ли возможность у модуля иметь полновесный конфиг?

Так работает:


	public function init()

	{

		Yii::$app->setComponent('errorHandler', [

			'class' => 'yii\base\ErrorHandler',

			'errorAction' => 'site/test',

		]);


		return parent::init();

	}



Ищите, где облажались.

Лично у меня есть сомнения насчет


$this->configure($config);

Это Вы модуль же конфигурируете, а в приложении вызывается что-нибудь типа


\Yii::$app->errorHandler->паниковать(),

что является синонимом


\Yii::$app->getComponent('errorHandler')->паниковать().

to ORey,

вообще какая-то хрень творится с конфигурированием модуля…

вот так РАБОТАЕТ


Yii::app()->setComponents(array(

    'errorHandler' => array(

            'errorAction' => 'paul/qwe/error'

        ), 

));

а так НЕ РАБОТАЕТ


$this->setComponents(array(

    'errorHandler' => array(

            'errorAction' => 'paul/qwe/error'

        ), 

));

встречал решения на основе


public function beforeControllerAction($controller, $action)

{

   Yii::app()->errorHandler->errorAction='admin/default/error';

}

а уж про использование компонентов внутри модуля - просто абзац!

p.s. сейчас склоняюсь к конфигурированию на этой основе = Yii::app()->setComponents

обязательно чтобы не было моветоном?

Я вижу, я не был понят.

Смотрите, какая штука. Вот есть у Вас класс “приложение” (потомок класса “модуль”, ну пофиг). К нему прицеплены некоторые компоненты, допустим, errorHandler. Стандартный обработчик ошибок делает, допустим, следующее: при перехвате эксепшена передает управление на $app->getComponent(‘errorHandler’).

Первым способом вы тупо подтыкаете в app() свой компонент (этакий dependency injection), поэтому все вызовы к этому компоненту (в частности, вызов от обработчика ошибок) отработают как надо.

Во втором случае Вы подтыкаете компонент в пространство МОДУЛЯ, поэтому все вызовы типа $app->getComponent(‘errorHandler’) продолжат использовать старый компонент. При этом для запросов к компонентам модуля наверняка можно использовать что-то типа $app->getModule(‘myModule’)->getComponent(‘errorHandler’), но это не Ваш случай, поскольку перехватчик ошибок всегда вызывает компонент приложения.

Вот, немного муторно вышло, но надеюсь идея понятна. Детали надо уже в api reference смотреть.

UPD. И, кстати, я Вам весело и задорно выкатил синтаксис Yii2, в yii1 конечно нужно использовать app() вместо $app, ну и так далее.

это я сразу осознал :rolleyes:

и у меня еще вот какой вопрос = как обратится к компоненту модуля внутри представления модуля?

так =


Yii::app()->getComponent('mypop')->str;

почему спрашиваю: получаю ошибку при


echo Yii::app()->getComponent('mypop')->str;

См выше. getModule попробуйте.