это скорее вопрос «лучшей практики», чем реальная проблема:
Я работаю над проектом в Symfony 2, и я создал пакет для обработки всех мои веб-сервисы. По сути, один контроллер принимает некоторые данные JSON, отправляет их другому контроллеру, чтобы проверить его соответствие описанному формату, затем переходит к другому контроллеру для обработки вызовов базы данных и, в конечном итоге, возвращается к исходному контроллеру для возврата ответа JSON.
Я отправляю данные между контроллерами, делая что-то вроде этого:
$controller = new \Acme\myBundle\Controller\DefaultController;
$response = $controller->function();
Это работает правильно, но я все время сталкиваюсь с одной проблемой. В контроллере я передаю данные, мне нужно создать экземпляр AppKernel и вызвать функцию загрузки для работы любой функции Symfony. Мне это кажется немного глупым, что наводит меня на мысль, что я, возможно, все делаю неправильно.
Любые предложения или советы приветствуются!
ИЗМЕНИТЬ / ОБНОВИТЬ Всем спасибо за комментарии. Я настроил свои контроллеры как службы, службы работают, но мне все еще нужно вручную загружать / создавать экземпляр ядра, когда я вызываю службу изнутри службы.
#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"
Из другого контроллера пакетов я могу без проблем вызвать функцию из любой из этих служб:
$test = $this->get("service.handler")->testFunction();
$test2 = $this->get("service.definitions")->anotherTestFunction();
У меня ДЕЙСТВИТЕЛЬНАЯ проблема возникает, если я вызываю функцию внутри одной службы, а затем пытаюсь вызвать другую службу изнутри этой службы. service Я получаю следующую ошибку 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
. Я могу избежать этой ошибки, используя эту функцию и вызывая ее, вместо того, чтобы использовать $ 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);
}
Я думаю, мое решение «работает», но это определенно не кажется эффективным способом делать что-то .
РЕДАКТИРОВАТЬ 2: Если я вставлю это в начало класса, а затем изменю вызов службы, он, кажется, работает ... Все еще не уверен, лучший ли это способ делать что-то.
protected $container;
public function __construct($container) {
$this->container= $container;
}