如何将控制器定义为服务

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何将控制器定义为服务

在Sy欧宝娱乐app下载地址mfony中,控制器可以需要注册为服务。但是如果你用默认的服务。yaml的配置你的控制器已注册为服务。这意味着您可以像使用其他正常服务一样使用依赖注入。

从路由引用你的服务

将控制器注册为服务是第一步,但您还需要更新路由配置以正确引用服务,以便Symfony知道如何使用它。欧宝娱乐app下载地址

使用service_id: method_name引用控制器方法的语法。如果服务id是你的控制器的全限定类名(FQCN),就像Symfony推荐的那样,那么如果控制器不是服务,语法是一样的:欧宝娱乐app下载地址控制器应用\ \ HelloController:索引

  • 注释
  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /控制器/ HelloController.php名称空间应用程序控制器使用欧宝娱乐app下载地址组件路由注释路线HelloController/ * * *@Route("/hello", name="hello", methods={"GET"}) */公共函数指数()/ /……}}

调用控制器

控件还可以定义单个动作__invoke ()方法,这是在遵循ADR模式(Action-Domain-Responder):

  • 注释
  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /控制器/ Hello.php名称空间应用程序控制器使用欧宝娱乐app下载地址组件HttpFoundation响应使用欧宝娱乐app下载地址组件路由注释路线/ * * *@Route("/hello/{name}", name="hello") */你好公共函数__invoke的名字“世界”返回响应(sprintf (“你好% s !”的名字));}}

基本控制器方法的替代方案

在使用定义为服务的控制器时,仍然可以扩展AbstractController基础控制器使用它的快捷方式。但是,你不需要这样做!您可以选择扩展没有什么,并使用依赖注入访问不同的服务。

基地控制器类源代码是了解如何完成普通任务的好方法。例如,$ this - >渲染()通常用于渲染树枝模板并返回响应。但是,你也可以直接这样做:

在定义为服务的控制器中,可以改为注入嫩枝服务并直接使用:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / src /控制器/ HelloController.php名称空间应用程序控制器使用欧宝娱乐app下载地址组件HttpFoundation响应使用嫩枝环境HelloController私人嫩枝公共函数__construct(环境嫩枝->树枝=嫩枝;}公共函数指数的名字内容->嫩枝->呈现(“你好/ index.html.twig”, (“名字”= >的名字]);返回响应(内容);}}

你也可以用特价基于动作的依赖注入接收服务作为控制器动作方法的参数。

基本控制器方法及其服务替换

最好的办法就是看怎么换碱控制器方便的方法是看AbstractController保存其逻辑的类。

如果您想知道每个服务使用什么类型提示,请参阅getSubscribedServices ()方法AbstractController

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。