DI в конфигурации

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
spavlov
Сообщения: 66
Зарегистрирован: 2011.07.29, 10:42

DI в конфигурации

Сообщение spavlov »

Всем привет.

Не знал как назвать лучше тему :( В общем, проблема с контейнером внедрения зависимостей.

Есть общий контроль доступа в конфигурации бекенда main.php:

Код: Выделить всё

'as access'  => [
		'class'        => 'yii\filters\AccessControl',
		'except'       => ['auth/login'],
		'denyCallback' => function ($params, $action) {
			exit(Yii::t('yii', 'You are not allowed to perform this action.'));
		}, 'rules'     => [
			[
				'allow' => true,
				'roles' => ['backendAccess'],
			],
		],
	],
Как только я добавляю в \components\User\User.php конструктор с зависимостью

Код: Выделить всё

class User extends \yii\web\User
{
	private $dispatcher;

	public function __construct(\core\dispatchers\EventDispatcher $dispatcher, $config = []) {
		$this->dispatcher = $dispatcher;
		parent::__construct($config);
	}

	protected function afterLogin($identity, $cookieBased, $duration) {
		parent::afterLogin($identity, $cookieBased, $duration);		
	}
}
все крашится:
yii\di\NotInstantiableException: Can not instantiate core\dispatchers\EventDispatcher. in ...vendor\yiisoft\yii2\di\Container.php:373
Stack trace:
#0 ..\\vendor\yiisoft\yii2\di\Container.php(156): yii\di\Container->build('core\\dispatcher...', Array, Array)
#1 ..\\vendor\yiisoft\yii2\di\Container.php(468): yii\di\Container->get('core\\dispatcher...')
#2 ..\\vendor\yiisoft\yii2\di\Container.php(371): yii\di\Container->resolveDependencies(Array, Object(ReflectionClass))
#3 ..\\vendor\yiisoft\yii2\di\Container.php(156): yii\di\Container->build('common\\componen...', Array, Array)
#4 ..\\vendor\yiisoft\yii2\BaseYii.php(349): yii\di\Container->get('common\\componen...', Array, Array)
#5 ..\\vendor\yiisoft\yii2\di\ServiceLocator.php(137): yii\BaseYii::createObject(Array)
#6 ..\\vendor\yiisoft\yii2\base\Module.php(742): yii\di\ServiceLocator->get('user', true)
#7 ..\\vendor\yiisoft\yii2\di\Instance.php(164): yii\base\Module->get('user')
#8 ..\\vendor\yiisoft\yii2\di\Instance.php(137): yii\di\Instance->get(NULL)
#9 ..\\vendor\yiisoft\yii2\filters\AccessControl.php(102): yii\di\Instance::ensure(Object(yii\di\Instance), 'yii\\web\\User')
#10 ..\\vendor\yiisoft\yii2\base\BaseObject.php(109): yii\filters\AccessControl->init()
#11 [internal function]: yii\base\BaseObject->__construct(Array)
#12 ..\\vendor\yiisoft\yii2\di\Container.php(384): ReflectionClass->newInstanceArgs(Array)
#13 ..\\vendor\yiisoft\yii2\di\Container.php(156): yii\di\Container->build('yii\\filters\\Acc...', Array, Array)
#14 ..\\vendor\yiisoft\yii2\BaseYii.php(349): yii\di\Container->get('yii\\filters\\Acc...', Array, Array)
#15 ..\\vendor\yiisoft\yii2\base\Component.php(191): yii\BaseYii::createObject(Array)
#16 ..\\vendor\yiisoft\yii2\BaseYii.php(546): yii\base\Component->__set('access', Array)
#17 ..\\vendor\yiisoft\yii2\base\BaseObject.php(107): yii\BaseYii::configure(Object(yii\web\Application), Array)
#18 ..\\vendor\yiisoft\yii2\base\Application.php(206): yii\base\BaseObject->__construct(Array)
#19 ..\\backend\web\index.php(20): yii\base\Application->__construct(Array)
#20 {main}
Хотя в bootstrap добавлено

Код: Выделить всё

$container->setSingleton(EventDispatcher::class, function (Container $container) {
return new MyEventDispatcher();
});
P.S. если я убираю из конфига 'as access', DI прекрасно работает

Я так понимаю, что до Bootstrap дело даже не доходит. Все крашится на этапе старта приложения и надо сконфигурировать container в конфигурации.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DI в конфигурации

Сообщение samdark »

Да. Попробуйте через 'container' в конфиге.
spavlov
Сообщения: 66
Зарегистрирован: 2011.07.29, 10:42

Re: DI в конфигурации

Сообщение spavlov »

Код: Выделить всё

'container' => [
		'singletons' => [
			EventDispatcher::class => [
				['class' => MyEventDispatcher::class],
				[
					Yii::$container,
					'param'
				],
			],
		],
	],
сконфигурировал так. вроде заработало :) Я только до конца не понял, что в данном случае предпочтительнее singletons[] или definitions[] ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DI в конфигурации

Сообщение samdark »

Зависит от того, хотите ли вы каждый раз новый инстанс или нет.
Ответить