Событие Symfony2 kernel.controller для одного контроллера или области действия пакета

Мой вопрос о маленькой, но важной детали, которую я обнаружил, читая эту статью: http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html

Мануал говорит, что объявлен TokenListener будет выполняться по каждому запросу. Итак, если у меня большое приложение с большим количеством контроллеров (или пакетов с собственными контроллерами) и множеством других типов прослушивателей событий, этот beaviour добавляет накладные расходы: каждый из прослушивателей событий будет выполняться в каждом запросе на каждый комплект! Например, у меня есть AppBundle и ApiBundle по умолчанию, и в данном примере TokenListener выполняется в случае запроса к обоим пакетам, потому что определено в специфической конфигурации приложения: app / config / services.yml

Как избежать этого вида? Как определить слушателей только для пакета или, лучше, для контроллера? Возможно, это может быть определено в специфических для связки services.yml, но это также слишком широкая область для слушателя, который используется в нескольких контроллерах.

2

Решение

Обратите внимание, что при каждом открытии страницы, вероятно, существует только один запрос (кроме подзапросов). Таким образом, слушатель вызывается только один раз.

Если вы также посмотрите на код слушателя, вы увидите, что он уже выполняет «сложную логику» только тогда, когда контроллер является экземпляром TokenAuthenticatedController, Это означает, что он уже делает то, что вы сказали, что вы хотели: только для некоторых контроллеров.

Единственные накладные расходы — это вызов слушателя. Это не добавляет много накладных расходов.

Делать что-то, чтобы предотвратить вызов слушателя, когда контроллер не является экземпляром TokenAuthenticatedController означает, что вы просто перемещаете проверку экземпляра из слушателя в метод перед слушателем, в результате чего возникают точно такие же издержки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]