这似乎是使用控制器作为服务的最快、最简单的方法,但我仍然缺少一个步骤,因为它不起作用。
这是我的代码:
控制器/服务:
// 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
}
Use :
// Test\TestBundle\Controller\UseController.php
// ...
public function useAction() {
$testService = $this->get('test_service');
}
当我这样做时,我收到错误
您请求了一个不存在的服务“test_service”。
当我检查服务列表时app/console container:debug
,我没有看到我新创建的服务。
我缺少什么?
From SensioFrameworkExtraBundle 中的控制器即服务 https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html#controller-as-service:
控制器类上的 @Route 注释也可用于将控制器类分配给服务,以便控制器解析器通过从 DI 容器获取控制器来实例化控制器,而不是调用 new PostController() 本身:
/**
* @Route(service="my_post_controller_service")
*/
class PostController
{
// ...
}
The 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
class.
See 如何将控制器定义为服务 http://symfony.com/doc/current/cookbook/controller/service.html and SensioFrameworkExtraBundle 中的控制器即服务 https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html#controller-as-service.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)