2017-03-21 1 views
1

Symfony 3 컨트롤러가 실행되기 전에 일부 코드를 실행해야합니다.Symfony3에서 요청할 때마다 컨트롤러 앞에 몇 가지 코드를 실행하십시오.

본 가이드는 읽는 방법을 설명하는 http://symfony.com/doc/current/event_dispatcher/before_after_filters.html을 읽었습니다.

그러나

이 시점에서 : 문서는 우리가 우리가 필요로하는 각각의 컨트롤러에 implements TokenAuthenticatedController를 사용하여이 EventListener의 영향을받습니다 어떤 컨트롤러를 지정해야하지만 있다고 설명 http://symfony.com/doc/current/event_dispatcher/before_after_filters.html#tag-controllers-to-be-checked 내가 모든 컨트롤러 전에 (모든) 코드를 실행하려는 때문에 , 내 모든 컨트롤러에 implements을 추가하지 않고도이를 수행 할 수있는 방법이 있기를 바랍니다.

답변

4

정말 모든 요청에 ​​대해 코드를 실행해야합니까? 그렇다면 사용 가능한 KernelEvent (특히 kernel.request 및 kernel.controller)를 살펴 봐야합니다. 기본 및 하위 요청과 같은 자세한 내용은 http://symfony.com/doc/current/components/http_kernel.html으로 이동하십시오.

컨트롤러는 실제로 아무것도 구현할 필요가 없습니다. ,

if ($controller[0] instanceof TokenAuthenticatedController) { 
     $token = $event->getRequest()->query->get('token'); 
     if (!in_array($token, $this->tokens)) { 
      throw new AccessDeniedHttpException('This action needs a valid token!'); 
     } 
    } 

을 당신이 당신의 수신기에 컨트롤러와 아무것도 당신이 원하는대로 당신은 그냥 할 수있는 다른 물건을하지 않으려면 모든 것을 너희에게 준 : TokenAuthenticatedController은 실행의 예에서 구현된다 당신의 일을 할 필요가있는 것은 청취자에게 주입되어 그 시점에서 이용 가능합니다. 워드 프로세서에서

편집 :

kernel.controller 리스너가 컨트롤러가 실행 직전에, 모든 요청에 ​​통보됩니다. 먼저, 요청과 일치하는 컨트롤러에 토큰 유효성 검사가 필요한지 식별하는 방법이 필요합니다.

마지막으로 실행 된 컨트롤러에 관계없이 코드를 실행하려면 앞서 언급 한 방식으로 실행될 컨트롤러를 식별 할 필요가 없으므로 인터페이스가 필요하지 않습니다.

2

예제에 표시된 예제에서 interface TokenAuthenticatedController은 모든 컨트롤러의 모든 요청에서 실행되지 않도록 해당 인터페이스를 구현하는 모든 컨트롤러에서 특정 코드를 실행하는 데만 사용됩니다.

Events and Event Listeners에 설명 된대로 마스터 요청과 같이 미리 정의 된 유형 또는 모든 요청 유형에서 코드를 실제로 실행할지 확인해야 할 수도 있습니다.

관련 문제