云客Drupal源码分析之控制器执行及其解析器controller_resolver

本文详细探讨了Drupal的控制器解析过程,从如何通过ControllerResolver获取控制器到解析控制器参数的步骤。讲解了_controller变量的重要性,以及在请求对象和路由增强器中的作用。同时,提到了Drupal8中防止过早渲染的闭包包装控制器策略,并建议对控制器解析器添加缓存机制以提高性能。
摘要由CSDN通过智能技术生成

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值