jest to bardziej „najlepszej praktyki” kwestii niż rzeczywistego problemu:Symfony2 danych przepływających między wiązkami i kontrolerów
pracuję nad projektem w Symfony 2 i I został zbudowany pakiet do obsługi wszystkich moje webservices. Zasadniczo jeden kontroler pobiera pewne dane JSON, wysyła je do innego kontrolera, aby sprawdzić, czy pasuje do opisanego formatu, a następnie wyłącza go do innego kontrolera, aby obsłużył wywołania bazy danych i ostatecznie powrócił do kontrolera początkowego, aby zwrócić odpowiedź JSON.
jestem wysyłania danych między kontrolerami robiąc coś takiego:
$controller = new \Acme\myBundle\Controller\DefaultController;
$response = $controller->function();
ta działa poprawnie, ale stale napotykając jednego problemu. W kontrolerze przekazuję dane do potrzebuję utworzenia instancji AppKernel i wywołania funkcji rozruchowej dla dowolnej funkcji Symfony. Wydaje mi się to trochę głupie, co prowadzi mnie do przekonania, że robię to wszystko źle.
Wszelkie sugestie i wskazówki doceniane!
EDIT/UPDATE Dziękuję wszystkim za komentarze. Skonfigurowałem moje kontrolery jako usługi, usługi działają, ale nadal potrzebuję ręcznie uruchamiać/tworzyć instancję jądra, gdy wywołuję usługę z poziomu usługi.
#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"
Z innego kontrolera wiązki można następnie wywołać funkcję z jednej z tych usług bez problemu:
$test = $this->get("service.handler")->testFunction();
$test2 = $this->get("service.definitions")->anotherTestFunction();
Gdzie ja mam problem jest, jeśli wywołanie funkcji wewnątrz jednej usługi, a następnie starają się wywołać inną usługę z wewnątrz tej usługi otrzymuję następujący błąd PHP za
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
mogę uniknąć tego błędu przy użyciu tej funkcji i nazywając ją raczej niż przy użyciu $ to
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);
}
Domyślam się, że moje rozwiązanie "działa", ale z pewnością nie wydaje się to skutecznym sposobem działania.
EDIT 2: Jeśli trzymać to w górnej części klasy następnie modyfikować usługi połączeń wydaje się działać ... Nadal nie wiem, czy jest to najlepszy sposób, aby robić różne rzeczy.
protected $container;
public function __construct($container) {
$this->container= $container;
}
Myślę, że opcja [przekierowanie] (http://symfony.com/doc/current/book/controller.html#forwarding) może być tutaj dostępna. –
Czy istnieje powód, dla którego nie korzystasz z usług [http://symfony.com/doc/current/cookbook/controller/service.html] do obsługi różnych metod? – richsage