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 を使用してフィルターを有効および無効にする方法は知って
いますが、フロントエンド バンドルに対して適切な場所を見つけることができません。

私の管理セクションはルートプレフィックスでアクセスできますmyadmin

www.example.com/myadmin/ -> 管理セクション = フィルターを無効にする (設定ではデフォルトで無効になっています) www.example.com/... -> その他 = フィルターを有効にします。

4

2 に答える 2

6

Doctrine レベルではバンドルの概念はありません。私が見る唯一の方法は、kernel.requestイベントまたはイベント中にそのクラス名(反射など)を解析することにより、使用されているコントローラーを検出することkernel.controllerです。

この例からインスピレーションを得ることができます:

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

次に、コントローラーが にあることを検出した場合はFrontendBundle、教義フィルターを無効/有効にします。

いつ無効/有効にするかを検出するためにルーティングを使用したい場合は、kernel.requestイベントを使用してください。たとえば、次のようにして、すべてのリクエスト パラメータにアクセスできます$event->getRequest()->attributes->get('_controller')

于 2013-01-15T15:43:27.347 に答える