2012-10-15 9 views
5

Korzystanie z symfony2. Mam klasy słuchacza, który próbuje wywołać metodę z innej klasy (kontroler) tak:"Wywołanie funkcji członkowskiej get() na obiekcie nie będącym obiektem"?

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

a kontroler isTokenValid metody:

public function isTokenValid($token) { 

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

rzuca błąd

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 

Jeśli prawidłowo załaduję metodę sterownika (korzystając z routingu w adresie URL), działa ona prawidłowo.

+0

Test-obudowy wymagany –

+0

@LightnessRacesinOrbit mi wybaczyć? –

+0

Jakiś problem z tym? –

Odpowiedz

7

Symfony2 wykorzystuje Dependency Injection wzór, trzeba wstrzyknąć pojemnik, który posiada wszystkie usługi (takie jak połączenia z bazą danych):

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

Oczywiście zakładam tutaj, że klasa słuchacz jest ContainerAware

[+] aby słuchacz ContainerAware przechodzą @service_container do niego (przykład forma 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 

, a następnie w konstruktorze klasy słuchacza z was:

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

Właściwie to nie sądzę, że jego kontenery, to rzuciło błąd 'niezdefiniowana właściwość: $ container' .. –

+0

zobacz moją zmienioną odpowiedź –

+0

Nice. Widzę, co masz teraz na myśli. Czy '[@service_container]' literał, czy powinienem zastąpić to czymś? Przepraszam, że nie rozumiem, co to jest kontener .. –

3

Dodaję kolejną odpowiedź, bo co @ dev null mieszkańca wskazuje jest złą praktyką: w prawie każdym przypadku lepiej wstrzyknąć tylko potrzebne usługi - nie cały pojemnik:

use Doctrine\DBAL\Connection; 

public function __construct(Connection $connection) 
{ 
    $this->connection = $connection; 
} 
my_listener: 
    arguments: [ @database_connection ] 
Powiązane problemy