我一直在努力了解如何利用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 ] ]
有人可以帮助我了解我是否想将其丢失或误解以使其可用?
注意:如果需要其他任何信息以更好地理解我的问题,请告诉我,以便我更新我的问题:)
提前谢谢!
答案 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())