Symfony2 Weitergabe von Daten zwischen bundles & Controller
dies ist mehr ein "best-practice" - Frage als ein Tatsächliches problem:
Arbeite ich an einem Projekt in Symfony 2 und ich habe gebaut ein bundle mit all meiner webservices. Im Grunde ein controller nimmt einige JSON-Daten, sendet es an einen anderen controller, um zu sehen, es entspricht einer beschriebenen format, dann auf einen anderen controller zu handhaben, die Datenbank-Aufrufe und schließlich zurück an den ersten controller wieder eine JSON-Antwort.
Ich bin senden von Daten zwischen Steuerungen von etwas wie dies:
$controller = new \Acme\myBundle\Controller\DefaultController;
$response = $controller->function();
Dies funktioniert einwandfrei, aber ich komme immer über ein problem. Im controller gebe ich Daten brauche ich, um zu instanziieren AppKernel und rufen Sie die boot-Funktion für alle Symfony-Funktion zu arbeiten. Dies scheint mir ein wenig albern, die führt mich zu glauben, ich kann dies alles falsch.
Irgendwelche Vorschläge oder Tipps dankbar!
BEARBEITEN/AKTUALISIEREN
Danke Euch allen für die Kommentare. Ich habe meinen Controller als services, die Dienste funktionieren aber ich bin immer noch brauchen, um manuell starten/erstellen der kernel, wenn ich den Aufruf eines service innerhalb einer service.
#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"
Anderen bundles controller kann ich dann eine Funktion aufrufen, die entweder aus den entsprechenden services ohne problem:
$test = $this->get("service.handler")->testFunction();
$test2 = $this->get("service.definitions")->anotherTestFunction();
Denen ich ein problem habe ist, wenn ich rufe eine Funktion innerhalb eines service, dann rufen Sie versuchen, einen anderen Dienst innerhalb dieses Dienstes bekomme ich folgende PHP-Fehler
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
Kann ich vermeiden, dass Fehler durch die Verwendung dieser Funktion und nennen es anstatt $this
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);
}
Ich denke, meine Lösung "funktioniert", aber es ist sicherlich nicht scheinen eine effiziente Art und Weise, Dinge zu tun.
EDIT 2:
Wenn ich kleben diesen an der Spitze der Klasse, dann ändern Sie den service anrufen scheint es zu funktionieren... immer Noch nicht sicher, ob dies der beste Weg, Dinge zu tun.
protected $container;
public function __construct($container) {
$this->container= $container;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde nach unten gehen, den controller-as-a-service route mit den oben genannten. Sagen Sie anrufen 3 Methoden als Teil Ihrer Verarbeitung. Nennen wir Sie
foo()
,bar()
undsomething()
. Jede dieser Methoden sind in der separaten Controller:Dito für die
bar()
undsomething()
Methoden, jede in Ihren eigenen controller. Dann fügen Sie Sie Ihrer Anwendung als Dienst. Z.B. in deinemconfig.yml
(andere Methoden):Finden Sie die Symfony-docs für mehr details darüber, wie Sie erstellen können Sie diesen Eintrag, einschließlich der Injektion von Abhängigkeiten wie ein entity-manager oder ähnliches. Jetzt können Sie eine Instanz dieser aus dem container:
Ebenfalls wieder für
BarController
undSomethingController
. Der Vorteil ist jetzt, dass dieser Dienst zur Verfügung gestellt werden kann an jedem beliebigen Punkt in Ihrer Anwendung (ob nun über den container, wie oben beschrieben, oder als injiziert service), über bundles, ohne zu instanziieren der Klasse selbst per Hand und stellen Sie alle Abhängigkeiten.Für mehr Informationen über den container, etc, die Symfony-docs haben eine gutes Kapitel auf Sie (auf die in dem link oben).
Bearbeiten: Anpassung der code-Beispiel, um Einzelheiten der übergabe-Argumente in den Dienst. Auch wurde eine Bequemlichkeit
get()
- Methode zum abrufen von Leistungen aus dem container.AppKernel.php
? Sie sollte automatisch gestartet werden, wenn Sie Hinzugefügt haben, können Sie in hier.Ich schlage controller als service.