2013-09-25 11 views
8

Próbuję uzyskać dostęp do usługi w Symfony Controllernie mam dostępu do pojemnika w moim kontrolera

$session = $this->get('session'); 

Ale pojawia się kolejny błąd:

PHP Fatal error: Call to a member function get() on a non-object 

Myślałem, że Symfony2 miał kontrolery zdefiniowane domyślnie jako usługi.

Uwaga: to pytanie zostało pierwotnie zadane przez Dbugger, ale usunął go bez powodu, gdy już został odebrany.

Odpowiedz

15

Korzystanie pojemnik w kontrolerach

get() jest tylko funkcją skrótu dostarczone przez Symfony base Controller class aby uzyskać dostęp do pojemnika.

Twój kontroler musi rozszerzyć tę klasę aby skorzystać z tej funkcji:

namespace Acme\ExampleBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    // your actions 
} 

Jeśli nie chcesz polegać na tej klasie (z jakichś powodów) można rozszerzyć ContainerAware aby pojemnik wstrzykiwany i używać go jak w get() skrótu:

namespace Acme\ExampleBundle\Controller; 
use Symfony\Component\DependencyInjection\ContainerAware; 

class DefaultController extends ContainerAware 
{ 
    public function exampleAction() 
    { 
     $myService = $this->container->get('my_service'); 

     // do something 
    } 
} 

Tworzenie kontrolerów na własnych

kontrolery nie są zdefiniowane jako usługi domyślnie można je zdefiniować, ale nie jest konieczne, aby uzyskać kontener. Jeśli zostanie wysłane żądanie, struktura routingu określa kontroler, który musi zostać wywołany. Następnie kontroler zostaje skonstruowany, a pojemnik jest wstrzykiwany za pomocą metody setContainer().

Ale jeśli sam zbudujesz kontroler (w teście lub gdziekolwiek indziej), musisz samodzielnie wstrzyknąć pojemnik.

$controller = new DefaultController(); 
$controller->setContainer($container); 
// $container comes trough DI or anything else. 
+1

przestarzałe od wersji 2.8, do usunięcia w wersji 3.0. Zamiast tego użyj ContainerAwareTrait. – jan

+0

@jan Możesz zobaczyć, ile lat ma odpowiedź? Widzisz, że jest to wpis wiki społeczności? Idź i zaktualizuj, edytuj tę odpowiedź, zamiast kpić ze swojej nieaktualnej ... –

Powiązane problemy