2

Symfony2 アプリケーションで Doctrine2 の SoftDeleteable 動作拡張を使用して、非アクティブ化されたユーザーとそれらに関連するエンティティを非表示にしたいと考えています。これはフロントエンドにとって優れたシンプルなソリューションですが、管理セクションでこのフィルターを無効にして、これらのエンティティを再度有効にできるようにしたいと考えています。管理セクションは別のバンドルにあります。

ドキュメントによると、このフィルターを無効にするのは、リポジトリにクエリを実行する前に次の行を書くのと同じくらい簡単です。

$em->getFilters()->disable('soft-deleteable');

ここで、管理バンドル全体でこの動作を無効にして、関連するすべてのコントローラー アクションでこのフィルターの設定を解除する必要がないようにする方法があるかどうかを尋ねたいと思います。

ありがとうございました。

4

2 に答える 2

1

バンドル名を検出し、フィルターを有効にするか無効にするかを決定します。

有効化/無効化をどこで行うべきか疑問に思っている場合は、この回答を確認してください

于 2014-08-23T17:54:40.483 に答える
0

Tomáš のリンクは、問題の解決に役立ちました。それが最善の解決策ではないかもしれませんが、それが私が実装した方法です:

PHPクラスを作成しました:

namespace Acme\AdminBundle\EventListener;

use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

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('/(.*)\\\(.*)Bundle\\\Controller\\\(.*)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: Goldfish\AdminBundle\EventListener\SoftDeleteListener
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

そのようにして目標を達成しました.SoftdeletableフィルターはAdminBundle全体で無効になっており、すべてのコントローラーで手動でオフにする必要はありません.

于 2014-09-08T13:07:10.730 に答える