2011-06-27 3 views
11

Przeczytałem cały rozdział w dokumentach Symfony2 i napisałem, że jeśli dodaję detektor do zdarzenia kernel.controller, mogę zamienić kontroler, który zostanie uruchomiony, mam coś, co działa trochę jak ten:Próbuję zamienić kontroler za pomocą detektora zdarzeń z Symfony2

public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 

    $replacementControllerName = .... //Some logic to work out the name of the new controller 
    $replacementController = ?? //Not sure what goes here 

    $event->setController($replacementController); 
} 

bit jestem pewien, czy to kiedyś pracowałem na nazwę kontrolera zastępczej, w jaki sposób uzyskać wystąpienie z niego, że może przejść do setController?

Odpowiedz

17

Można ustawić kontroler do każdej na żądanie, co oznacza coś jak

  • metody statycznej array('class', 'method')
  • metody instancji array($instance, 'method')
  • Anonimowa funkcja function() { ... }
  • zwykłej funkcji globalny 'function';
  • Instancja klasy realizującego sposób new MyClassImplementingInvoke()
  • Specjalna składnia 'class::method' który wymusza ControllerResolver aby utworzyć nową instancję class (wywołanie konstruktora bez żadnego argumentu) __invoke() i powrocie wywoływalnym array($instanceOfClass, 'method')

EDYTOWANIE:

Podszedłem do niewłaściwego ControllerResolver. Po uruchomieniu Symfony w standardowej konfiguracji użyje się Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver (a nie Symfony\Component\HttpKernel\Controller\ControllerResolver). Tak więc nazwa kontrolera będzie traktowana trochę inaczej niż to, co napisałem powyżej.

Poniższy przykład podsumowuje wszystkie możliwe opcje dostępne podczas ustawiania kontrolera.

public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 
    // call method in Controller class in YourBundle 
    $replacementController = 'YourBundle:Controller:method'; 
    // call method in service (which is a service registered in the DIC) 
    $replacementController = 'service:method'; 
    // call method on an instance of Class (created by calling the constructor without any argument) 
    $replacementController = 'Class::method'; 
    // call method on Class statically (static method) 
    $replacementController = array('Class', 'method'); 
    // call method on $controller 
    $controller   = new YourController(1, 2, 3); 
    $replacementController = array($controller, 'method'); 
    // call __invoke on $controller 
    $replacementController = new YourController(1, 2, 3); 
    $event->setController($replacementController); 
} 
+0

Dzięki za odpowiedzi, ale nadal mam problemy z dostaniem coś pracy, która z tych opcji jest najlepszym sposobem, aby uzyskać konfigurację kontrolera więc będzie pracować jakby Symfony stworzył go? – pogo

+0

To byłaby opcja 6. –

+0

Przepraszam, że mogę być głupi, ale nadal nie jestem pewien jak to zrobić, czy możesz zamieścić przykładowy kod? Jestem nieco zdezorientowany, ponieważ myślałem, że metoda class :: zawsze odwołuje się do metody statycznej, więc nie widzę, w jaki sposób wyzwaliby ControllerResolver, aby cokolwiek zrobić. – pogo