如何将控制器定义为服务

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.2,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何将控制器定义为服务

在本书中,您已经了解了扩展基础时如何轻松地使用控制器控制器类。虽然这可以正常工作,但也可以将控制器指定为服务。

请注意

将控制器指定为服务需要做更多的工作。主要的优点是整个控制器或传递给控制器的任何服务都可以通过服务容器配置进行修改。这在开发开源包或将在许多不同项目中使用的包时特别有用。

第二个优势是你的控制器更加“沙盒化”。通过查看构造函数参数,很容易看出这个控制器可以做什么,也可以不做什么。因为每个依赖项都需要手动注入,所以当你的控制器变得太大时就更明显了(例如,如果你有很多构造函数参数),并且可能需要被分割成多个控制器。

因此,即使您没有将控制器指定为服务,您也可能会在一些开源Symfony2包中看到这一点。ob娱乐下载理解这两种方法的优缺点也很重要。

将控制器定义为服务

控制器可以像其他类一样定义为服务。例如,如果你有以下简单的控制器:

12 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间AcmeHelloBundle控制器使用ob娱乐下载组件HttpFoundation响应HelloController公共函数indexAction的名字返回响应(身体的< html > < >你好”的名字”!');}}

然后可以将其定义为服务,如下所示:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# src / Acme / HelloBundle /资源/ config / services.yml参数:#……acme.controller.hello.class:Acme \ HelloBundle \ \ HelloController控制器服务:acme.hello.controller:类:“% acme.controller.hello.class %”

引用服务

要引用定义为服务的控制器,请使用单个冒号(:)符号。例如,转发到indexAction ()方法acme.hello.controller

1
->转发(“acme.hello.controller: indexAction”);

请注意

你不能把行动使用此语法时,方法名的一部分。

您还可以在定义路由时使用相同的符号来路由到服务_controller值:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / routing.yml你好:路径:/你好默认值:_controller:acme.hello.controller: indexAction

提示

您还可以使用注解来使用定义为服务的控制器来配置路由。有关详细信息,请参阅frameworkextrabunda欧宝官网下载appnce文档。

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

当使用定义为服务的控制器时,它很可能不会扩展基控制器类。您将直接与所需的服务交互,而不是依赖其快捷方法。幸运的是,这通常很简单控制器类源代码是一个关于如何执行许多常见任务的伟大来源。

类型的对象,而要呈现模板响应对象,那么如果你要扩展Symfony的基控制器,你的代码看起来会像这样:ob娱乐下载

12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间AcmeHelloBundle控制器使用ob娱乐下载FrameworkBundle控制器控制器HelloController扩展控制器公共函数indexAction的名字返回->呈现(“AcmeHelloBundle:你好:index.html.twig”数组“名字”= >的名字));}}

的源代码渲染在Symfony的功能ob娱乐下载控制器类,您将看到该方法实际上使用模板服务:

1 2 3 4
公共函数渲染视图数组,参数=数组()、响应响应= null)返回->容器->get (“模板”->renderResponse (视图参数响应);}

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间AcmeHelloBundle控制器使用ob娱乐下载FrameworkBundle模板EngineInterface使用ob娱乐下载组件HttpFoundation响应HelloController私人模板公共函数__construct(EngineInterface模板->模板=模板;}公共函数indexAction的名字返回->模板->renderResponse (“AcmeHelloBundle:你好:index.html.twig”数组“名字”= >的名字));}}

服务定义也需要修改以指定构造函数参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
# src / Acme / HelloBundle /资源/ config / services.yml参数:#……acme.controller.hello.class:Acme \ HelloBundle \ \ HelloController控制器服务:acme.hello.controller:类:“% acme.controller.hello.class %”参数:[" @templating "]

而不是获取模板服务可以从容器中注入只有将您需要的确切服务直接添加到控制器中。

请注意

这并不意味着您不能从自己的基本控制器扩展这些控制器。远离标准基控制器是因为它的帮助器方法依赖于可用的容器,而定义为服务的控制器则不是这样。将公共代码提取到注入的服务中,而不是将代码放入扩展的基本控制器中,这可能是一个好主意。这两种方法都是有效的,具体如何组织可重用代码取决于您自己。

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