根据在 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
    }
}

希望这对某人有所帮助