это скорее вопрос «лучшей практики», чем реальной проблемы:
Я работаю над проектом в Symfony 2, и я собрал пакет для обработки всех моих веб-сервисов. По сути, один контроллер получает некоторые данные JSON, отправляет их другому контроллеру для проверки их соответствия описанному формату, затем передает их другому контроллеру для обработки вызовов базы данных и в конечном итоге возвращает первоначальному контроллеру для возврата ответа JSON.
Я отправляю данные между контроллерами, делая что-то вроде этого:
$controller = new \Acme\myBundle\Controller\DefaultController;
$response = $controller->function();
Это работает правильно, но я продолжаю сталкиваться с одной проблемой. В контроллере я передаю данные мне нужно создать экземпляр AppKernel и вызвать функцию загрузки для работы любой функции Symfony. Мне это кажется немного глупым, что наводит меня на мысль, что я все делаю неправильно.
Любые предложения или советы приветствуются!
EDIT / UPDATE
Спасибо всем за комментарии. Я настроил свои контроллеры как сервисы, сервисы работают, но мне все еще нужно вручную загружать / создавать экземпляр ядра, когда я вызываю сервис изнутри сервиса.
#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();
Если у меня действительно возникает проблема, то если я вызываю функцию внутри одного сервиса, а затем пытаюсь вызвать другой сервис из этого сервиса, я получаю следующую ошибку 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;
}