2014-09-10 14 views
7

dziwny problem, Mam kontroler, który wykorzystuje \ Symfony \ komponentu \ wstrzykiwanie zależności \ ContainerAwareTraitSymfony pojemnik cech

class MainController 
{ 
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait; 
    /** 
    * @Route("/", name="_index") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     var_dump($this->container); 

     return array(); 
    } 
} 

ale wynik jest NULL.

Próbował on:.

  • Symfony 2.5 *
  • MAMP 3,0
  • PHP 5,4 5,5

Moje poszukiwania nie pomógł mi. Myślę, że rozwiązanie jest łatwe.

Jakieś pomysły dotyczące śledzenia tego błędu?

UPD: Kiedy wysuwam się z kontrolera, kontener jest dostępny i wszystko działa poprawnie. Ale zgodnie z symfony rozszerzenie kontrolera jest opcjonalne, zamiast tego mogę używać cech.

+0

Niezależnie od tego, czy ustawisz kontener, czy go sprawdzisz? – sergekv

+1

Nie ustawiłem pojemnika, symfony to zrobić. Po rozszerzeniu od kontrolera kontener jest dostępny. Ale zgodnie z symfony Kontroler referencyjny rozszerzający Controller jest opcjonalny, mogę zamiast tego używać cech. – wtorsi

Odpowiedz

20

Spróbuję zgadywać na podstawie szybkiego spojrzenia na kod źródłowy Symfony: Nadal musisz zadeklarować, że przestrzegasz interfejsu ContainerAwareInterface.

Tak właśnie wygląda kod, gdy Symfony ustawia kontener na kontrolerze.

if ($controller instanceof ContainerAwareInterface) { 
    $controller->setContainer($this->container); 
} 

Więc przypuszczam, że trzeba zrobić coś takiego:

use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerAwareTrait; 
// ... 
class MainController implements ContainerAwareInterface 
{ 
    use ContainerAwareTrait; 
    /** 
    * @Route("/", name="_index") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     var_dump($this->container); 

     return array(); 
    } 

}

Tak na marginesie, to prawdopodobnie całkiem dobra sprawa dla Duck Typing, szczególnie gdyby nazwie metoda jest trochę bardziej konkretna lub jeśli taniej jest sprawdzić typy parametrów metodami w czasie wykonywania

+0

Dziękuję, oszczędzasz mi wiele godzin. – wtorsi

+0

Czy możesz rozwinąć nieco swoją propozycję dotyczącą pisania na klawiaturze? Obawiam się, że tego nie rozumiem. – flu

+1

@flu Autorzy Symfony mogli (zamiast używać 'instanceof') sprawdzić, czy kontroler ma metodę' setContainer'. W niektórych językach programowania nazywa się to "protokołem nieformalnym" lub bardziej swobodnie "Kaczym pisaniem" (jeśli kpi jak kaczka, załóż, że można nim manipulować jak kaczką). PHP może nie być najlepszym językiem do tego, ale lubię łączyć idee na różnych platformach, w miarę możliwości na SO. Powód, dla którego mówię, że może nie być najlepszy, polega na tym, że generalnie chciałbyś sprawdzić nie tylko, że istnieje metoda 'setContainer', ale także, że bierze ona właściwy typ rzeczy jako jej parametr. –