2012-10-15 16 views
5

Utilizzo di symfony2. Ho una classe ascoltatore che sta tentando di chiamare un metodo da una classe diversa (un controller) in questo modo:'Chiama ad una funzione membro get() su un oggetto non'?

 $authenticate = new AuthenticationController(); 
     $authenticate->isTokenValid($token); 

E il controller metodo isTokenValid:

public function isTokenValid($token) { 

    $conn = $this->get('database_connection'); 

sta gettando l'errore

Fatal error: Call to a member function get() on a non-object in /home/content/24/9254124/html/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 246 

Se carico il metodo del controller nel modo corretto (utilizzando il routing nell'URL) funziona correttamente.

+0

Testcase richiesto –

+0

@LightnessRacesinOrbit scusarmi? –

+0

Qualche problema con quello? –

risposta

7

Symfony2 usa modello Dependency Injection, si deve iniettare contenitore che contiene tutti i servizi (come la connessione al database):

$authenticate = new AuthenticationController(); 
$authenticate->setContainer($this->container); 
$authenticate->isTokenValid($token); 

Naturalmente mi assumo qui che la classe ascoltatore è ContainerAware

[+] per rendere il vostro ascoltatore ContainerAware, passa @service_container ad esso (sotto forma ad esempio services.yml)

my.listener: 
    class: ACME\MyBundle\ListenerController 
    arguments: [ @service_container ] 
    tags: 
     - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 
    kernel.event_listener: 
     event: kernel.controller 

e poi nel costruttore di voi classe listener:

public function __construct($container = null){ 
    $this->container = $container; 
} 
+0

In realtà, non penso che il suo contenerewareware, ha gettato il errore 'proprietà non definita: $ container' .. –

+0

vedi la mia risposta modificata –

+0

Nice. Capisco cosa intendi ora. '' [@service_container] 'è letterale, o dovrei sostituirlo con qualcosa? Scusa la mia mancanza di comprensione di cosa sia un contenitore .. –

3

Sto aggiungendo un'altra risposta, perché ciò che @ dev-null-abitante suggerisce è una cattiva pratica: in quasi tutti i casi è meglio di iniettare solo i servizi necessari - non l'intero contenitore:

use Doctrine\DBAL\Connection; 

public function __construct(Connection $connection) 
{ 
    $this->connection = $connection; 
} 
my_listener: 
    arguments: [ @database_connection ] 
Problemi correlati