如何使用容器访问自定义异常的参数

How to use Container to access parameters on a custom Exception

我一直在努力理解如何利用 Container 来访问位于 config/parameters.yml.

的参数

我手上的问题是我创建了一些自定义 Exceptions 并且我创建了一个库,每次触发其中一个异常时都会让我松懈。为此,我需要将 container 发送到 Logger,以便能够在库中提取它们。

但是我没能抓住container。我有一个需要注入的想法,我可以在 config/services.yml 中实现这一点,但我不明白如何实现。

到目前为止,这是我取得的成就:

我的自定义异常父项

因为所有异常都从父类扩展,它们都会触发Logger。正是在这一点上,我需要 container 存在:

abstract class CriticalLogAlertException extends \RuntimeException
{
    protected $logger;

    public function __construct ($message = "", $code = 0, Throwable $previous = NULL)
    {
        parent::__construct($message, $code, $previous);

        Log::critical(
                      $this->message, 
                      [], 
                      AbstractCredentialsFactory::YAML_TYPE,
                     'PARAMETERS CONTAINER ACCESS NEEDS TO BE ADDED HERE'
                    );
    }

    abstract public function generateMessage($message) : string;
}

我想在这个 class 上创建一个方法 setContainer() 我可以在我的 config/services.yml:

中使用
public function setContainer(ContainerInterface $container)
{
    $this->container - $container;
}

所以在这一点上我可以在摘要 class 中创建一个 property 并使用它将它传递给 library 因为它已经在 class execution.虽然我不太确定这是 可实现的 还是 正确的 ;

我的config/services.yml

下面是我添加到我的服务容器中的代码:

 ExceptionContainer:
      class: AppBundle\Exception\CriticalLogAlertException
      calls:
          - [ setContainer,[ @service_container ] ]

有人可以帮助我理解它是否是我遗漏或误解的东西以便将其设置为可用吗?

注意:如果需要其他任何东西来更好地理解我的问题,请告诉我,以便我更新我的问题:)

提前致谢!

Sooo,这花了我一段时间,但我必须深入研究才能理解,这意味着要经过一些斗争和研究才能开始更好地理解它。

尽管我很久以前就开始使用它,但它被搁置了一段时间,但对于那些对这个过程有相同和新想法的人来说,让我分享一下:)

因为我用 throw new 实例化异常意味着我可以直接访问 __construct 方法。这意味着,如果我的异常需要 ContainerInterface,我必须提供一个。

现在,两种情况都可以解决这个问题。

1.注射

通过注入,我可以通过使用可用服务(我们可以使用以下命令检查)来自动装配需求;

php bin/console debug:autowiring

或者,如果注入 custom class,我需要指定它在 services.yml

提供的位置、内容和内容

我指的是添加到 services.yml 的可能示例如下所示:

TestException:
        class: AppBundle\Exception\TerminationAmlkyc
        arguments: ['@service_container']
        public: true

2。实例化

在我的例子中,我要么在需要时将 ContainerInterface 转移到新的 class 中,要么能够像上面提到的那样进行实例化。

因为我的来源是 ContainerAwareCommand 我可以利用 $this->getContainer() 来检索它,然后在需要时将它传递给异常。

throw new TestException($this->getContainer())