为了账号安全,请及时绑定邮箱和手机立即绑定

根据在 Symfony 中调用的位置阻止监听器被激活

根据在 Symfony 中调用的位置阻止监听器被激活

PHP
素胚勾勒不出你 2022-06-17 15:47:08
我有一个包含很多捆绑包的 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        }...有没有办法做到这一点?提前致谢
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

所以这就是我解决它的方法:


将请求堆栈添加到服务:


<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

    }

}

希望这可以帮助某人


查看完整回答
反对 回复 2022-06-17
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信