如何将一个Doctrine过滤器应用于Symfony中的整个包?

我想在我的Symfony2应用程序中使用DocDefine2的SoftDeleteable行为扩展来隐藏与它们相关的停用用户和实体。 这对于前端来说是非常简单的解决方案,但是我希望为管理部分禁用此过滤器,以便可以重新启用这些实体。 管理部分位于单独的包中。

该文档说,在查询存储库之前,禁用此过滤器就像写这一行一样容易:

$em->getFilters()->disable('soft-deleteable');

现在我想问一下,是否有任何方法可以禁用整个管理包的此行为,以便为每个相关控制器操作取消设置该过滤器操作。

谢谢。


您检测包名称并决定是启用还是禁用过滤器。

如果您想知道在哪里执行启用/禁用,请检查此答案


Tomáš的链接帮助我解决了这个问题。 尽管它可能不是我实现它的最佳解决方案:

我创建了一个PHP类

namespace AcmeAdminBundleEventListener;

use SymfonyComponentHttpKernelEventFilterControllerEvent;

class SoftDeleteListener {

    public function onKernelController(FilterControllerEvent $event) {
        // Get the full name of the current controller
        $controllername = $event->getRequest()->attributes->get('_controller');

        $matches = array();
        // Explode the name of the current controller
        preg_match('/(.*)(.*)BundleController(.*)Controller::(.*)Action/', $controllername, $matches);

        // preg_match should store the name of the bundle at the second index of the array
        if (isset($matches[2]) && $matches[2] == "Admin") {
            $controller = $event->getController();
            $doctrine = $controller[0]->get('doctrine');
            $em=$doctrine->getManager();
            $em->getFilters()->disable('softdeleteable');
        }
    }
}

并将这些行添加到services.yml以使其监听kernel.controller事件:

kernel.listener.admin_softdelete_listener:
        class: GoldfishAdminBundleEventListenerSoftDeleteListener
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

这样我达到了我的目标 - 整个AdminBundle禁用了软删除过滤器,并且我不需要在每个控制器中手动关闭它。

链接地址: http://www.djcxy.com/p/65029.html

上一篇: How to apply a Doctrine filter to a whole bundle in Symfony?

下一篇: Softdeletable behaviour and really deleting the entity