4

我目前正在我的 Symfony2.1 项目中使用以下设置 实现 Doctrine过滤器:

<?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

问题是我无法检索所有文章进行管理!
有没有办法为某个捆绑包启用此过滤器?
ps 我知道如何使用 EntityManager 启用和禁用过滤器,
我只是找不到为前端 Bundle 执行此操作的合适位置。

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

www.example.com/myadmin/ -> 管理部分 = 禁用过滤器(在配置中默认禁用) www.example.com/... -> 其他任何东西 = 启用过滤器。

4

2 回答 2

13

查看 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 来测试它。

于 2013-10-28T23:32:54.637 回答
6

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

你可以从这个例子中启发自己:

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

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

如果您更喜欢使用路由来检测何时禁用/启用,只需使用kernel.requestevent. 例如,您将可以访问所有请求参数$event->getRequest()->attributes->get('_controller')

于 2013-01-15T15:43:27.347 回答