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

时间:2018-11-28 16:48:56

标签: php symfony symfony3.x

我一直在努力了解如何利用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;
}

虽然我是在此类上创建可以在setContainer()中使用的方法config/services.yml

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

因此,在这一点上,我可以在抽象类中创建一个property并将其传递给library,因为它已经在class execution上可用。尽管我不太确定这是可以实现还是正确

我的config / services.yml

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

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

有人可以帮助我了解我是否想将其丢失或误解以使其可用?

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

提前谢谢!

1 个答案:

答案 0 :(得分:0)

Sooo,这花了我一段时间,但我不得不更深入地了解才能理解,这意味着需要进行一些斗争和研究,然后才能开始更好地理解它。

尽管我已经使用了一段时间,但还是离开了一段时间,但是对于那些想知道该过程是否相同和新颖的人,让我分享一下:)

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

现在,两个案例方案可以解决此问题。

1。注射

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

php bin/console debug:autowiring

或者,如果要注入 custom 类,我需要在services.yml

上指定它在哪里,提供什么以及提供什么

下面是我要添加到services.yml的示例:

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

2。实例化

就我而言,我要么在需要上新课程时转移了ContainerInterface,要么可以按照上面的引用进行实例化。

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

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