4

db内のいくつかのレジスタをチェックするようにリスナーを構成する必要がありますが、このチェックアクションは、その中のすべてのアクションに対して1つのバンドルでのみ実行する必要があります。

バンドルに関数を書き込むたびに関数を呼び出したくないので、リスナーを実行することを考えました。

Symfonyは1つのバンドルでのみリスナーを設定することを許可していますか?

ありがとう。

4

2 に答える 2

4

あなたはこれについて間違って考えています。バンドルに対して実行するようにリスナーを構成することはできません。実際には、リスナーはそのイベントが発生するのを待つだけです。これは、リスナーがいつ呼び出されるかを定義するイベントです。本当に達成したいことは、コントローラーの各アクションの前にイベントを発生させることです。

これを行うには、kernel.Controller イベントをリッスンしてから、次のようにします。

$controller = $event->getController();
if ($controller instanceof mybundlecontroller) {
    // fire custom event e.g. My.db.lookup
}
$event->setController($controller)

この場合、別のリスナーを起動することができます。

ドキュメントを参照してください: http://symfony.com/doc/current/book/internals.html#kernel-controller-event

于 2012-05-31T18:02:05.567 に答える
0

私の場合... event.controllerを使用します。ルートは「カスタムルートにリスナーを使用する」のに役立ちます

サービス

    kernel.listener.corporation.manage:
        class:  Site\CorporationBundle\Event\SiteCorporationManageListener
        arguments: ["@doctrine.orm.entity_manager"]
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

クラス

class SiteCorporationManageListener
{
    private $oEntityManager = null;

    public function __construct(EntityManager $oEntityManager)
    {
        $this->oEntityManager = $oEntityManager;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
            // get variable from url if needed
            // $event->getRequest()->get('urlVariable', null); 
            $route = $event->getRequest()->get('_route');

            if (strstr($route, 'corporation')) {
                if (!strstr($route, 'corporation_index')) {
                    echo 'some request done';
                }
            }
        }
    }
}

ルート

corporation_index_default:
# . . .
corporation_api_default:
# . . .    
corporation_manage_default:
# . . .

私たちの場合、リスナーはでのみ機能します

corporation_api_default:
# . . .
corporation_manage_default:
# . . .
于 2013-10-01T22:10:25.127 に答える