TP5.0.20中Controller类无法进入前置操作方法bug解决方案

TP5.0.20中Controller类无法进入前置操作方法bug解决方案

七月 10, 2018

今天上午使用TP5(5.0.20)开发接口的时候,发现核心控制器(think\Controller)中的一个源码bug。核心控制器中有一个受保护的属性 protected $beforActionList,这个属性的意思是“前置操作方法列表”,也就是调用一个接口前要先执行另外一个前置方法(类似于python中的装饰器作用)。 前置方法的使用方法如下:

protected $beforeActionList=[
‘firstFunction’=>[‘only’=>’createOrUpdateAddress’]
];

firstFunction是createOrUpdateAddress的前置方法,调试时发现无法进入此方法。于是使用断点调试进入tp5核心控制器追踪源码。发现错误原因是由于tp5的request->action()把请求的方法(也就是createOrUpdateAddress)自动转化为了小写。而我们在前置操作方法列表$beforeActionList中定义的方法名是小驼峰命名法。断点调试截图如下。 所以,需要我们把$beforeActionList总定义的方法转化为小写(当然,你也可以使用全小写的方法名来定义方法,但这不符合开发者的命名规范)。所以,最好的方法还是改修TP5源码。修改方法如下图所示。 找到tp5核心控制器think\Controller的第91行,加入如下代码。表示把$beforeActionList列表中定义的方法名转换为小写。 这样就可以顺利进入我们自定义的前置操作方法了。