如何将一个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?