这更像是一个“最佳实践”问题,而不是一个实际问题:
我正在 Symfony 2 中开发一个项目,并且构建了一个包来处理我的所有 Web 服务。基本上,一个控制器获取一些 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();
我遇到的问题是,如果我调用一个服务内部的函数,然后尝试从该服务内部调用另一个服务,我会收到以下 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);
}
我想我的解决方案“有效”,但它看起来显然不是一种有效的做事方式。
EDIT 2:如果我将其放在类的顶部,然后修改服务调用,它似乎可以工作......仍然不确定这是否是最好的方法。
protected $container;
public function __construct($container) {
$this->container= $container;
}