db内のいくつかのレジスタをチェックするようにリスナーを構成する必要がありますが、このチェックアクションは、その中のすべてのアクションに対して1つのバンドルでのみ実行する必要があります。
バンドルに関数を書き込むたびに関数を呼び出したくないので、リスナーを実行することを考えました。
Symfonyは1つのバンドルでのみリスナーを設定することを許可していますか?
ありがとう。
db内のいくつかのレジスタをチェックするようにリスナーを構成する必要がありますが、このチェックアクションは、その中のすべてのアクションに対して1つのバンドルでのみ実行する必要があります。
バンドルに関数を書き込むたびに関数を呼び出したくないので、リスナーを実行することを考えました。
Symfonyは1つのバンドルでのみリスナーを設定することを許可していますか?
ありがとう。
あなたはこれについて間違って考えています。バンドルに対して実行するようにリスナーを構成することはできません。実際には、リスナーはそのイベントが発生するのを待つだけです。これは、リスナーがいつ呼び出されるかを定義するイベントです。本当に達成したいことは、コントローラーの各アクションの前にイベントを発生させることです。
これを行うには、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
私の場合... 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:
# . . .