Symfony 如何使用注释将控制器定义为服务?

Symfony 如何使用注释将控制器定义为服务?,symfony,service,annotations,Symfony,Service,Annotations,这似乎是将控制器作为服务使用的最快、最简单的方法,但我仍然错过了一步,因为它不起作用 这是我的代码: 控制器/服务: // Test\TestBundle\Controller\TestController.php use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; /** * @Route(service=

这似乎是将控制器作为服务使用的最快、最简单的方法,但我仍然错过了一步,因为它不起作用

这是我的代码:

控制器/服务:

// 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
}
使用:

当我这样做的时候,我得到了错误

您请求了一个不存在的服务“测试服务”

当我用
app/console container:debug
检查服务列表时,我没有看到我新创建的服务

我错过了什么?

来自:

控制器类上的@Route注释还可用于将控制器类分配给服务,以便控制器解析程序将通过从DI容器获取控制器而不是调用新的PostController()本身来实例化控制器:

注释中的
service
属性只是告诉Symfony它应该使用指定的服务,而不是用
new
语句实例化控制器。它不会自行注册服务

给定控制器:

使用Symfony\Bundle\FrameworkBundle\Controller\Controller;
使用Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
/**
*@Route(service=“测试服务”)
*/
类TestController
{
公共职能行动()
{
}
}
您需要使用
test\u服务
id将控制器实际注册为服务:

services:
    test_service:
        class: Test\TestBundle\Controller\TestController
这种方法的优点是,您可以通过在服务定义中指定依赖项来将依赖项注入构造函数,并且不需要扩展基本
控制器


请参阅和。

对于未来的用户,如果您决定使用控制器即服务,您最好通过构造函数将服务注入控制器,而不是通过服务定位器获取服务。前者被认为是一种反模式,而后者允许简单的单元测试,而且更为详细

因此,不是:

public function useAction() {
    $testService = $this->get('test_service');
}
你应该:

private $yourService;

public function __construct(YourService $yourService)
{
    $this->yourService = $yourService;
}

public function useAction()
{
    $this->yourService->use(...);
}
不要创建快捷方式,编写可靠的、可维护的代码。

对于,我们不需要将控制器注册为服务,因为它们已经使用默认的
services.yml
配置注册为服务

你只需要写下:

// current controller

public function myAction() {
  $test = $this->get(SomeController::class)->someAction($param);
}

好吧,那我全搞错了。谢谢你精确而清晰的回答!您可能会喜欢此捆绑包,它为控制器添加了自动布线:www.tomasvotruba.cz/blog/2016/03/10/autowired-controllers-as-services-for-lazy-people这实际上是将其作为服务的主要原因谢谢。我甚至不再需要那个答案了,但我希望它能帮助其他人!似乎适用于不使用实体管理器的函数。我尝试使用另一个函数,该函数使用query builder构造查询,但在声明实体管理器时出错
错误:对成员函数的调用has()为null
。但我仍然可以访问该功能。
private $yourService;

public function __construct(YourService $yourService)
{
    $this->yourService = $yourService;
}

public function useAction()
{
    $this->yourService->use(...);
}
// current controller

public function myAction() {
  $test = $this->get(SomeController::class)->someAction($param);
}