Symfony 2.1 Doctrine过滤器(启用/禁用)

时间:2013-01-14 19:52:08

标签: symfony configuration filter doctrine-orm symfony-2.1

我目前正在Symfony2.1项目中使用以下设置实现Doctrine filters

<?php

namespace Acme\Bundle\Entity;

class Article {
    /**
     * @ORM\Column(type="string")
     */
    private $status;
    ...
}

//app/config/config.yml
doctrine:
    orm:
        filters:
            status:
                class:   Acme\Bundle\Filter\StatusFilter
                enabled: false
        ....

//src/Acme/Bundle/Filter/StatusFilter.php
namespace Acme\Bundle\Filter;

use Acme\Bundle\Entity\Status;

class StatusFilter extends SQLFilter {

    public function addFilterConstraint(ClassMetadata $target, $alias)
    {
        $filter =
            $target->reflClass->implementsInterface('Acme\Bundle\Entity\Status')?
                $alias . '.status = ' . Status::PUBLISHED : '';

        return $filter;
    }
}

Acme \ Bundle \ Entity \ Status只是一个界面 在config.yml中启用过滤器时,代码按预期工作。

问题是我无法检索所有用于管理的文章! 有没有办法为某个捆绑包启用此过滤器?
附:我知道如何使用EntityManager启用和禁用过滤器,
我找不到适合前端Bundle的地方。

我的管理部分可通过路由前缀myadmin

访问

www.example.com/myadmin/ - &gt; admin section =禁用过滤器(在配置中默认禁用) www.example.com / ... - &gt;其他任何事情=启用过滤器。

2 个答案:

答案 0 :(得分:12)

查看Doctrine代码,有一些启用和禁用过滤器的方法。

在config.yml文件中定义过滤器后,您可以在控制器或服务中启用/禁用:

// 'status' is the unique name of the filter in the config file
$this->getDoctrine()->getManager()->getFilters()->enable('status');

$this->getDoctrine()->getManager()->getFilters()->disable('status');

注意:这是从Symfony 2.3中获取的。您需要使用以前版本的Symfony / Doctrine进行测试。

答案 1 :(得分:5)

在Doctrine级别没有捆绑概念。我看到的唯一方法是通过在kernel.request事件或kernel.controller事件期间解析其className(反射,...)来检测使用哪个控制器。

你可以从这个例子中激励自己:

https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/EventListener/ParamConverterListener.php#L46

然后,如果您检测到您的控制器位于FrontendBundle,则只需禁用/启用您的学说过滤器。

如果您更喜欢使用路由来检测何时禁用/启用,请使用kernel.request事件。您可以通过$event->getRequest()->attributes->get('_controller')访问所有请求参数。