questo è più di un 'best practice' questione di un problema reale:Symfony2 dati che passano tra fasci e controller
Sto lavorando su un progetto in Symfony 2 e ho costruito un pacchetto per gestire tutte i miei servizi web Fondamentalmente un controllore prende alcuni dati JSON, li invia a un altro controllore per verificare che corrisponda a un formato descritto, quindi off a un altro controller per gestire le chiamate al database e infine tornare al controller iniziale per restituire una risposta JSON.
che sto invio di dati tra i controllori facendo qualcosa di simile a questo:
$controller = new \Acme\myBundle\Controller\DefaultController;
$response = $controller->function();
Questo funziona correttamente, ma io continuo a tutto un problema. Nel controller passano i dati a Ho bisogno di istanziare AppKernel e chiamare la funzione di avvio per far funzionare qualsiasi funzione di Symfony. Questo per me sembra un po 'sciocco che mi porta a credere che stia sbagliando tutto questo.
Qualsiasi suggerimento o suggerimento apprezzato!
MODIFICA/AGGIORNAMENTO Grazie a tutti per i commenti. Ho configurato i miei controller come servizi, i servizi funzionano ma ho ancora bisogno di avviare/istanziare manualmente il kernel quando chiamo un servizio da un servizio.
#config.yml
# API Services
services:
service.handler:
class: Acme\APIBundle\Controller\ServicesController
arguments:
container: "@service_container"
service.definitions:
class: Acme\APIBundle\Controller\DefinitionController
arguments:
container: "@service_container"
Da un altro controller fasci posso quindi chiamare una funzione da uno di questi servizi senza problemi:
$test = $this->get("service.handler")->testFunction();
$test2 = $this->get("service.definitions")->anotherTestFunction();
Dove ho un problema è se io chiamo una funzione all'interno di un servizio, allora provare a chiamare un altro servizio da dentro quel servizio ricevo il seguente errore PHP
Fatal error: Call to a member function get() on a non-object in /vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 188
posso evitare tale errore utilizzando questa funzione e chiamandolo piuttosto che utilizzare questo $
public function bootKernel(){
//boot kernel
$controller = new \Acme\myBundle\Controller\DefaultController;
$kernel = new \AppKernel('dev', true);$kernel->loadClassCache();
$kernel->boot();
$controller->setContainer($kernel->getContainer());
return($controller);
}
Suppongo che la mia soluzione "funzioni", ma certamente non sembra un modo efficace per fare le cose.
EDIT 2: Se mi attengo questo al vertice della classe quindi modificare il servizio di chiamata sembra funzionare ... Ancora non so se questo è il modo migliore di fare le cose.
protected $container;
public function __construct($container) {
$this->container= $container;
}
Penso che [l'inoltro] (http://symfony.com/doc/current/book/controller.html#forwarding) possa essere un'opzione qui. –
C'è un motivo per cui non stai utilizzando [servizi] (http://symfony.com/doc/current/cookbook/controller/service.html) per gestire i tuoi diversi metodi? – richsage