根据在 Symfony 中的调用位置阻止监听器被激活
Prevent a listener from being activated depending on where it was called in Symfony
我有一个包含很多包的 Symfony 项目。
在其中一个中,我有一个像这样的标准 Doctrine 监听器:
class MyListener
{
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof MyEntity) {
//do something
}
...
现在我创建了一个新的 Bundle,它也在控制器中加载了这些实体。
不出所料,它也触发了侦听器中的 postLoad。
我需要它不要触发它,或者如果它被这个 Bundle/Controller 触发,不要做任何事情,比如:
class MyListener
{
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($caller = "DontTriggerBundle")
return true;
}
if ($entity instanceof MyEntity) {
//do something
}
...
有办法吗?提前致谢
我就是这样解决的:
向服务添加了请求堆栈:
<service id="myservice>
<argument type="service" id="request_stack"/>
</service>
然后得到这样的控制器:
// src/AppBundle/EventListener/AcmeListener.php
namespace AppBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class AcmeListener
{
/** @var Request */
protected $request;
/**
* AcmeListener constructor.
*
* @param RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack)
{
$this->request = $requestStack->getCurrentRequest();
}
/**
* @param LifecycleEventArgs $args
*/
public function postLoad(LifecycleEventArgs $args)
{
$controller = $this->request->attributes->get('_controller');
if (strpos($controller, 'DontTriggerController::indexAction') !== false) {
// Do nothing
return;
}
// Do somethings
}
}
希望这对某人有所帮助
我有一个包含很多包的 Symfony 项目。
在其中一个中,我有一个像这样的标准 Doctrine 监听器:
class MyListener
{
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof MyEntity) {
//do something
}
...
现在我创建了一个新的 Bundle,它也在控制器中加载了这些实体。
不出所料,它也触发了侦听器中的 postLoad。
我需要它不要触发它,或者如果它被这个 Bundle/Controller 触发,不要做任何事情,比如:
class MyListener
{
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($caller = "DontTriggerBundle")
return true;
}
if ($entity instanceof MyEntity) {
//do something
}
...
有办法吗?提前致谢
我就是这样解决的:
向服务添加了请求堆栈:
<service id="myservice>
<argument type="service" id="request_stack"/>
</service>
然后得到这样的控制器:
// src/AppBundle/EventListener/AcmeListener.php
namespace AppBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class AcmeListener
{
/** @var Request */
protected $request;
/**
* AcmeListener constructor.
*
* @param RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack)
{
$this->request = $requestStack->getCurrentRequest();
}
/**
* @param LifecycleEventArgs $args
*/
public function postLoad(LifecycleEventArgs $args)
{
$controller = $this->request->attributes->get('_controller');
if (strpos($controller, 'DontTriggerController::indexAction') !== false) {
// Do nothing
return;
}
// Do somethings
}
}
希望这对某人有所帮助