2013-09-25 11 views
8

Sto cercando di accedere ad un servizio in un controller di SymfonyNon ho accesso al container nel mio controller

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

Ma ottengo l'errore successivo:

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

ho pensato che Symfony2 ha avuto la controller definiti come servizi per impostazione predefinita.

Nota: questa domanda è stata originariamente richiesta da Dbugger, ma l'ha rimossa senza motivo, mentre era già stata data una risposta.

risposta

15

Utilizzando il contenitore controllori

get() è solo una funzione scorciatoia fornita dal Symfony base Controller class per accedere al contenitore.

Il controller deve estendere questa classe per utilizzare questa funzione:

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

class DefaultController extends Controller 
{ 
    // your actions 
} 

Se non si vuole dipendere da questa classe (per alcuni motivi) è possibile estendere ContainerAware per ottenere il contenitore iniettato e lo usano come nel get() scorciatoia:

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

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

     // do something 
    } 
} 

Creazione di controllori sui propri

controllori non sono definiti come i servizi per impostazione predefinita, è possibile definirli, ma non è necessario per ottenere il contenitore. Se viene effettuata una richiesta, il framework di routing determina il controller, che deve essere chiamato. Quindi il controllore viene costruito e il contenitore viene iniettato tramite il metodo setContainer().

Ma se si costruisce il controller da solo (in un test o altrove), è necessario iniettare il contenitore da solo.

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

deprecato dalla versione 2.8, da rimuovere in 3.0. Utilizzare invece ContainerAwareTrait. – jan

+0

@jan Puoi vedere quanti anni ha la risposta? Puoi vedere questa è una voce wiki della comunità? Vai e aggiorna modifica quella risposta invece di deridere è deprecato ... –

Problemi correlati