2

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

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

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

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

谢谢你。

4

2 回答 2

1

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

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

于 2014-08-23T17:54:40.483 回答
0

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

我创建了一个PHP 类

namespace Acme\AdminBundle\EventListener;

use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

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('/(.*)\\\(.*)Bundle\\\Controller\\\(.*)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: Goldfish\AdminBundle\EventListener\SoftDeleteListener
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

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

于 2014-09-08T13:07:10.730 回答