在drupal的HttpKernel核心中使用控制器解析器来取得要执行的控制器,以及解析出控制器需要的参数
除此之外也在多个地方用到它,比如渲染数组的回调解析,是一个重点内容
它的服务ID为:controller_resolver,接受以下两个参数:
psr7.http_message_factory:用于创建psr7描述的请求对象(关于这个请看:http://www.php-fig.org/psr/psr-7/)
class_resolver:从容器里面取服务
下面来看一看它是怎么工作的:
它需要实现ControllerResolverInterface接口,里面有两个方法定义:
public function getController(Request $request); //返回一个回调作为控制器
public function getArguments(Request $request, $controller); //求出控制器的参数,并以索引数组的方式返回
这个是Symfony的接口定义,此外drupal加了一个方法:
public function getControllerFromDefinition($controller); //以路由中对控制器的定义来获取控制器,同样返回回调
所以drupal的控制器解析器一共要实现接口的以上三个方法。
先看一看它怎么解析出控制器:
这必须依赖于路由过程中在请求对象属性包上设置的_controller参数,代码如下:
$request->attributes->get('_controller')),解析就是基于_controller的内容。
所有经过路由处理的请求对象上一定会有_controller变量,它来自路由定义的defaults字段
你可能奇怪在有些路由定义中没有定义_controller呢?
没有定义_controller的路由会在路由增强器里面定义,比如处理表单的路由里面定义了_form,而没有定义_controller,
但在增强器FormRouteEnhancer中就定义了$defaults['_controller'] = 'controller.form:getContentResult';
其中:controller.form表示服务ID,实体也是类似情况,这个用法见下文
当流程到达这里时,总之一定有_con