2014-09-10 31 views
7

problema Strano, ho regolatore che utilizza \ Symfony \ Component \ DependencyInjection \ ContainerAwareTraitcontenitore Symfony tratti

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

     return array(); 
    } 
} 

ma risultato è NULL.

provato su:.

  • Symfony 2.5 *
  • MAMP 3.0
  • PHP 5,4 5,5

Le mie ricerche non mi hanno aiutato. Penso che la soluzione sia facile.

Qualche idea su come rintracciare questo errore?

UPD: Quando si estende da Controller, il contenitore è disponibile e tutto funziona correttamente. Ma secondo symfony l'estensione del riferimento del controller è opzionale, posso invece usare i tratti.

+0

Se si imposta il contenitore, prima di controllarlo? – sergekv

+1

Non ho impostato il contenitore, symfony lo fa. Quando estendo dal controller, il contenitore è disponibile. Ma secondo symfony Controller control extending Controller è opzionale, posso invece usare i tratti. – wtorsi

risposta

20

Mi avventuro un'ipotesi basata su una rapida occhiata al codice sorgente Symfony: Devi ancora dichiarare di aderire all'interfaccia ContainerAwareInterface.

Ecco come appare il codice ogni volta che Symfony imposta un contenitore su un controller.

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

Allora suppongo avete bisogno di fare qualcosa di simile:

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(); 
    } 

}

Per inciso, questo è senza dubbio un buon argomento per Duck Typing, soprattutto se avessero chiamato il metodo qualcosa di un po 'più specifico o se fosse meno costoso ispezionare i tipi di parametri ai metodi in fase di esecuzione

+0

Grazie, mi hai salvato un sacco di ore. – wtorsi

+0

Puoi approfondire ulteriormente la tua proposta di Duck Typing? Ho paura di non capirlo. – flu

+1

@flu Gli autori di Symfony potrebbero avere (invece di usare 'instanceof') controllato se il tuo controller aveva un metodo' setContainer'. In alcuni linguaggi di programmazione, questo è chiamato "protocollo informale", o più casualmente, "Duck Typing" (Se cede come un'anatra, presume che possa essere gestito come un'anatra). PHP potrebbe non essere la lingua migliore per questo, ma mi piace collegare le idee attraverso le linee della piattaforma, laddove possibile, su SO. La ragione per cui dico che potrebbe non essere la migliore è che in genere si vorrebbe controllare non solo che esiste un metodo 'setContainer', ma anche che prende il tipo corretto di cosa come parametro. –