Symfony SonataAdmin工作流中何时应禁用条令过滤器?

Symfony SonataAdmin工作流中何时应禁用条令过滤器?,symfony,symfony-2.1,symfony-sonata,sonata-admin,Symfony,Symfony 2.1,Symfony Sonata,Sonata Admin,我确信这是一个常见的问题,我需要在SonataAdmin中关闭softdeletable和类似的过滤器,直到现在我一直在做: use Sonata\AdminBundle\Admin\Admin as BaseAdmin; class Admin extends BaseAdmin { /** * {@inheritdoc} */ public function configure() { /** * This ex

我确信这是一个常见的问题,我需要在SonataAdmin中关闭softdeletable和类似的过滤器,直到现在我一直在做:

use Sonata\AdminBundle\Admin\Admin as BaseAdmin;

class Admin extends BaseAdmin
{
    /**
     * {@inheritdoc}
     */
    public function configure()
    {
        /**
         * This executes everywhere in the admin and disables softdelete for everything, if you need something cleverer this should be rethought.
         */
        $filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters();

        if (array_key_exists('approvable', $filters->getEnabledFilters())) {
            $filters->disable('approvable');
        }

        if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) {
            $filters->disable('softdeleteable');
        }
    }
}
这导致了许多问题,一个,它需要条件,因为管理类配置了两次,一次用于构建nav,另一次用于构建接口,两个,管理类在冷缓存(可能是APC?)上实例化前端,这非常不酷


您打算将此逻辑放在哪里?

您可以使用事件侦听器。例如:

服务:

filter.configurator:
class: AppBundle\Filter\Configurator
arguments: ["@doctrine.orm.entity_manager"]
tags:
    - { name: kernel.event_listener, event: kernel.controller }
侦听器类:

namespace AppBundle\Filter;

use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Controller\CoreController;
use Sonata\AdminBundle\Controller\CRUDController;
use Sonata\AdminBundle\Controller\HelperController;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

/**
 * Class Configurator
 *
 * @author Andrey Nilov <nilov@glavweb.ru>
 */
class Configurator
{
    /**
     * @var Registry
     */
    private $em;

    /**
     * @param EntityManagerInterface $em
     */
    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    /**
     * onKernelRequest
     */
    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();
        $controllerClass = $controller[0];

        $isAdminController =
            $controllerClass instanceof CRUDController ||
            $controllerClass instanceof CoreController ||
            $controllerClass instanceof HelperController
        ;

        if ($isAdminController) {
            $this->em->getFilters()->disable('softdeleteable');
        }
    }
}
名称空间AppBundle\Filter;
使用条令\Bundle\DoctrineBundle\Registry;
使用条令\ORM\EntityManagerInterface;
使用Sonata\AdminBundle\Controller\CoreController;
使用Sonata\AdminBundle\Controller\CRUDController;
使用Sonata\AdminBundle\Controller\HelperController;
使用Symfony\Component\HttpKernel\Event\FilterControllerEvent;
/**
*类配置器
*
*@作者安德烈·尼洛夫
*/
类配置器
{
/**
*@var注册表
*/
私人股本$em;
/**
*@param entitymanager接口$em
*/
公共函数构造(EntityManager接口$em)
{
$this->em=$em;
}
/**
*onKernelRequest
*/
内核控制器上的公共函数(FilterControllerEvent$事件)
{
$controller=$event->getController();
$controllerClass=$controller[0];
$isAdminController=
$controllerClass实例积垢控制器||
$controllerClass实例为CoreController||
$controllerClass实例帮助控制器
;
如果($isAdminController){
$this->em->getFilters()->disable('softdeletable');
}
}
}

我最近没有参与过这个项目,但我相信我可以通过为适用的管理员添加自定义管理员控制器来实现这一点。此外,现在可以为特定实体禁用筛选器,这可能比全局禁用筛选器更好。是否有为特定实体禁用筛选器的代码示例@Steve?