Мой вопрос о маленькой, но важной детали, которую я обнаружил, читая эту статью: http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html
Мануал говорит, что объявлен TokenListener будет выполняться по каждому запросу. Итак, если у меня большое приложение с большим количеством контроллеров (или пакетов с собственными контроллерами) и множеством других типов прослушивателей событий, этот beaviour добавляет накладные расходы: каждый из прослушивателей событий будет выполняться в каждом запросе на каждый комплект! Например, у меня есть AppBundle и ApiBundle по умолчанию, и в данном примере TokenListener выполняется в случае запроса к обоим пакетам, потому что определено в специфической конфигурации приложения: app / config / services.yml
Как избежать этого вида? Как определить слушателей только для пакета или, лучше, для контроллера? Возможно, это может быть определено в специфических для связки services.yml, но это также слишком широкая область для слушателя, который используется в нескольких контроллерах.
Обратите внимание, что при каждом открытии страницы, вероятно, существует только один запрос (кроме подзапросов). Таким образом, слушатель вызывается только один раз.
Если вы также посмотрите на код слушателя, вы увидите, что он уже выполняет «сложную логику» только тогда, когда контроллер является экземпляром TokenAuthenticatedController
, Это означает, что он уже делает то, что вы сказали, что вы хотели: только для некоторых контроллеров.
Единственные накладные расходы — это вызов слушателя. Это не добавляет много накладных расходов.
Делать что-то, чтобы предотвратить вызов слушателя, когда контроллер не является экземпляром TokenAuthenticatedController
означает, что вы просто перемещаете проверку экземпляра из слушателя в метод перед слушателем, в результате чего возникают точно такие же издержки.
Других решений пока нет …