[英]How exactly can I define a controller as service using annotations?
这似乎是使用控制器作为服务的最快和最简单的方法,但我仍然缺少一步,因为它不起作用。
这是我的代码:
控制器/服务:
// Test\TestBundle\Controller\TestController.php
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
/**
* @Route(service="test_service")
*/
class TestController extends Controller {
// My actions
}
采用 :
// Test\TestBundle\Controller\UseController.php
// ...
public function useAction() {
$testService = $this->get('test_service');
}
当我这样做时,我得到了错误
您已请求不存在的服务“test_service”。
当我使用app/console container:debug
检查服务列表时app/console container:debug
,我看不到我新创建的服务。
我错过了什么?
从SensioFrameworkExtraBundle中的Controller as Service :
控制器类上的@Route注释也可用于将控制器类分配给服务,以便控制器解析器通过从DI容器中获取控制器来实例化控制器,而不是调用新的PostController()本身:
/** * @Route(service="my_post_controller_service") */ class PostController { // ... }
注释中的service
属性只是告诉Symfony它应该使用指定的服务,而不是使用new
语句实例化控制器。 它不会自行注册服务。
给你的控制器:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
/**
* @Route(service="test_service")
*/
class TestController
{
public function myAction()
{
}
}
您需要使用test_service
id将控制器实际注册为服务:
services:
test_service:
class: Test\TestBundle\Controller\TestController
这种方法的优点是,您可以通过在服务定义中指定它们来将依赖项注入构造函数中,并且不需要扩展基本Controller
类。
请参阅SensioFrameworkExtraBundle中的 如何将控制器定义为服务和Controller作为服务 。
对于未来的人,如果您决定使用控制器即服务,则最好通过构造函数将服务注入控制器,而不是通过服务定位器。 前者被认为是反模式,而后者允许简单的单元测试,而且更加冗长。
所以代替:
public function useAction() {
$testService = $this->get('test_service');
}
你应该:
private $yourService;
public function __construct(YourService $yourService)
{
$this->yourService = $yourService;
}
public function useAction()
{
$this->yourService->use(...);
}
不要创建快捷方式,编写可靠,可维护的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.