@MarkLb

Как договориться с контейнером чтобы он пробрасывал самого себя в конструктор?

Цель: Хочу использовать компонент Container в своём классе для инициализации объектов. Приложение - консольное.
Проблема: Выбрасывается исключение при использовании метода get():
Exception 'yii\base\UnknownPropertyException' with message 'Getting unknown property: yii\di\Container::params'

Описание иннициализации класса Container в Boostrap-компоненте:
$container = \Yii::$container;
$container->setSingleton(Container::class, function () use ($container) {
  return $container;
});

Класс, в котором вызывается метод:
class ObjectCreator
{
    private $container;

    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    public function creator($searchKey, array $map, $implementClass)
    {
        foreach ($map as $key => $class) {
            if ($searchKey === $key) {
                $targetObject = $this->container->get($class); // <<<<<<<< Вызов здесь

                if (!$targetObject instanceof $implementClass) {
                    throw new \RuntimeException(get_class($targetObject) . " must be instance of " . $implementClass);
                }
                return $targetObject;
            }
        }
        throw new \InvalidArgumentException("Unsupported key");
    }
}


Stack trace


Exception 'yii\base\UnknownPropertyException' with message 'Getting unknown property: yii\di\Container::params'

in /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/base/Component.php:155

Stack trace:
#0 /home/admin/web/prolet.loc/public_html/common/bootstrap/SetUp.php(39): yii\base\Component->__get('params')
#1 [internal function]: common\bootstrap\SetUp->common\bootstrap\{closure}(Object(yii\di\Container), Array, Array)
#2 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/di/Container.php(178): call_user_func(Object(Closure), Object(yii\di\Container), Array, Array)
#3 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/di/Instance.php(170): yii\di\Container->get('core\\lib\\matra...')
#4 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/di/Container.php(589): yii\di\Instance->get(Object(yii\di\Container))
#5 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/di/Container.php(407): yii\di\Container->resolveDependencies(Array, Object(ReflectionClass))
#6 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/di/Container.php(171): yii\di\Container->build('core\\lib\\matra...', Array, Array)
#7 /home/admin/web/prolet.loc/public_html/core/lib/goodsProvider/ProviderFactory.php(71): yii\di\Container->get('core\\lib\\matra...')
#8 /home/admin/web/prolet.loc/public_html/core/lib/goodsProvider/ProviderFactory.php(64): core\lib\goodsProvider\ProviderFactory->creator('matra', Array, 'core\\lib\\goodsP...')
#9 /home/admin/web/prolet.loc/public_html/core/services/order/ProviderManager.php(29): core\lib\goodsProvider\ProviderFactory->createBuyClass('matra')
#10 /home/admin/web/prolet.loc/public_html/console/controllers/OrderController.php(31): core\services\order\ProviderManager->buy(Object(core\entities\Order\Order))
#11 [internal function]: console\controllers\OrderController->actionPurchase()
#12 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#13 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/base/Controller.php(181): yii\base\InlineAction->runWithParams(Array)
#14 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/console/Controller.php(184): yii\base\Controller->runAction('purchase', Array)
#15 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/base/Module.php(528): yii\console\Controller->runAction('purchase', Array)
#16 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/console/Application.php(181): yii\base\Module->runAction('/order/purchase', Array)
#17 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/console/Application.php(148): yii\console\Application->runAction('/order/purchase', Array)
#18 /home/admin/web/prolet.loc/public_html/vendor/yiisoft/yii2/base/Application.php(392): yii\console\Application->handleRequest(Object(yii\console\Request))
#19 /home/admin/web/prolet.loc/public_html/yii(23): yii\base\Application->run()
#20 {main}

  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Уберите это:
$container = \Yii::$container;
$container->setSingleton(Container::class, function () use ($container) {
  return $container;
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы