如何定义控制器作为服务吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何定义控制器作为服务吗
在书中,您已经了解了如何使用容易控制器当它扩展了基础控制器类。虽然这工作很好,控制器也可以指定为服务。
请注意
指定一个控制器作为服务需要多一点的工作。主要的优势是,整个控制器或任何服务传递给控制器可以通过服务容器配置修改。这是特别有用,当开发一个开源包或任何包,将使用在许多不同的项目。
第二个优势是,控制器更“沙箱”。通过观察构造函数参数,很容易看到什么类型的这个控制器可能会或可能不会做的事情。,因为每个依赖需要手动注射,它更明显(即如果您有许多构造函数参数)当你的控制器已经变得太大,并可能需要分成多个控制器。
所以,即使你不指定控制器作为服务,你可能会看到在一些开源Symfony包完成。ob娱乐下载也很重要,理解这两种方法的优缺点。
定义控制器作为服务
一个控制器可以被定义为一个服务以同样的方式与其他类。例如,如果您有以下简单的控制器:
1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间Acme\HelloBundle\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;类HelloController{公共函数indexAction(美元的名字){返回新响应(“< html > <身体>你好”。美元的名字。”! < /身体> < / 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 %”
1 2 3 4 5 6 7 8 9
< !——src / Acme / HelloBundle /资源/ config /服务。xml - - ><参数>< !——……- - ><参数关键=“acme.controller.hello.class”>Acme \ HelloBundle \ \ HelloController控制器< /参数>< /参数><服务><服务id=“acme.hello.controller”类=“% acme.controller.hello.class %”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle /资源/ config / services.php使用ob娱乐下载\组件\DependencyInjection\定义;/ /……美元容器- >setParameter (“acme.controller.hello.class”,“Acme控制器\ HelloBundle \ \ HelloController”);美元容器- >setDefinition (“acme.hello.controller”,新定义(“% acme.controller.hello.class %”));
他指的是服务
指一个控制器的定义为一个服务,使用单一的冒号(:)符号。例如,期待indexAction ()
与id的方法上面定义的服务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}
1 2 3 4
< !——app / config /路由。xml - - ><路线id=“你好”路径=“/你好”><默认的关键=“_controller”>acme.hello.controller: indexAction< /默认的>< /路线>
1 2 3 4
/ / app / config / routing.php美元集合- >add (“你好”,新路线(' /你好',数组(“_controller”= >“acme.hello.controller: indexAction”)));
提示
您还可以使用注释来使用一个控制器配置路由定义为一个服务。有关详细信息,请参阅FrameworkExtraBundl欧宝官网下载appe文档。
替代基础控制器方法
当使用一个控制器定义为一个服务,它将最有可能不是扩展了基本控制器
类。而不是依靠其快捷方法,你会直接与你所需要的服务进行交互。幸运的是,这通常是非常简单和基础控制器类的源代码是一个伟大的来源如何执行许多常见任务。
例如,如果您想呈现一个模板,而不是创造响应
直接对象,那么你的代码是这样的如果你是延长Symfony的基本控制器:ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间Acme\HelloBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;类HelloController扩展控制器{公共函数indexAction(美元的名字){返回美元这- >呈现(“AcmeHelloBundle:你好:index.html.twig”,数组(“名字”= >美元的名字));}}
如果你看的源代码渲染
在Symfony的函数ob娱乐下载基本控制器类实际上,你会发现这个方法使用模板
服务:
1 2 3 4
公共函数渲染(美元视图数组,美元参数=数组()、响应美元响应= null){返回美元这- >容器- >get (“模板”)- >renderResponse (美元视图,美元参数,美元响应);}
控制器的定义为一种服务,你可以注入模板
服务和直接使用它:
1 2 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名称空间Acme\HelloBundle\控制器;使用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 "]
1 2 3 4 5 6 7 8 9 10 11 12 13
< !——src / Acme / HelloBundle /资源/ config /服务。xml - - ><参数>< !——……- - ><参数关键=“acme.controller.hello.class”>Acme \ HelloBundle \ \ HelloController控制器< /参数>< /参数><服务><服务id=“acme.hello.controller”类=“% acme.controller.hello.class %”><论点类型=“服务”id=“模板”/ >< /服务>< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / Acme / HelloBundle /资源/ config / services.php使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\参考;/ /……美元容器- >setParameter (“acme.controller.hello.class”,“Acme控制器\ HelloBundle \ \ HelloController”);美元容器- >setDefinition (“acme.hello.controller”,新定义(“% acme.controller.hello.class %”,数组(新引用(“模板”))));
而不是获取模板
服务容器,你可以注入只有具体的服务(s),你需要直接进入控制器。
请注意
这并不意味着你不能从自己的基地扩展这些控制器控制器。远离标准基础控制器因其助手方法依赖于可用的容器不被定义为服务的控制器。可能是一个好主意通用代码提取到一个服务,而不是地方代码注入的基本控制器扩展。这两种方法都是有效的,你想如何组织你的可重用代码。