繁体   English   中英

我怎样才能使用注释将控制器定义为服务?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM