How to define controllers as services in Symfony2
在symfony2中如何将controller定义为一个service ,并在路由配置文件中使用定义的控制器服务呢?其实很简单,就像把其他的类定义为服务一样,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php namespace Acme\AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class DemoController extends Controller { public function indexAction() { return new Response('Controller as a service.'); } } |
首先定义一个controller控制器,然后在你项目中的 services.xml (src/Acme/AppBundle/Resources/config/services.xml) 中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="UTF-8"?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <parameters> <!-- 特别要注意: 此处添加 parameter 的时候,后面的class类路径要都在同一行,不然会导致报错.不知道是不是一个BUG. --> <parameter key="acme_app.controller.demo_controller.class">Acme\AppBundle\Controller\DemoController</parameter> </parameters> <services> <service id="acme_app.controller.demo_controller" class="%acme_app.controller.demo_controller.class%"> <!-- 此处需要把symfony的容器注入进去,当然如果你需要使用其他的服务如模板之类的... --> <call method="setContainer"> <argument type="service" id="service_container" /> </call> </service> </services> </container> |
如何在路由配置文件里面使用定义好的控制器服务呢? 其实也很简单,在你的项目的路由配置routing.yml ( src/Acme/AppBundle/Resources/config/routing.yml )文件里面,添加如下配置即可:
1 2 3 4 5 6 | acme_app_index: path: / defaults: # 注意: 此处的 acme_app.controller.demo_controller 就是上面 services.xml # 里面定义的那个 id 名,后面跟的 indexAction 就是需要返回数据的操作 _controller: acme_app.controller.demo_controller:indexAction |
如果你需要在其他控制器或者类中需要使用定义好的这个控制器服务,只需要将symfony的容器注入到相应的类里面,然后这样获得即可:
1 2 3 4 5 | public function getAcmeAppDemoController() { // 此处就是定义好的服务 $acmeDemoController = $this->container->get('acme_app.controller.demo_controller'); } |