在ThinkPHP5.1 框架中自己封装了一个 trait 类,每次都在控制器中使用,但是在使用框架自身的验证器类(框架控制器方法)报错
在控制器中使用自定义验证器
$param = $this->request->post(); $result = $this->validate($param, LiveValidate::class); if (true !== $result) { return response_json(1, $result); }
日志错误信息:
[ error ] [0]致命错误: Call to a member function validate() on null[/var/www/www.tinywan.com/thinkphp/library/think/Controller.php:251]
以上错误就是由于应用了自定义的 trait 类导致的,如果移除该 trait 类则不会报错,加入以后就会报错。、
原因分析:
为何调用不了父类的控制器方法。由于自定义 trait 类 没有继承框架的构架方法。
解决办法:
在trait 类的构架方法中,继承父类的构架方法,解决问题
测试案例
基类控制器(模拟TP自带控制器)
class MyBaseController { /** * MyBaseController constructor. */ public function __construct() { echo " MyBaseController基类构架方法<br/>"; } /** * @desc: 基类-验证器 */ public function validate() { echo "基类-验证器 <br/>"; } }
自定义trait 类
trait MyTrait { protected $var = "MyTrait_var"; /** * MyTrait constructor. */ function __construct() { parent::__construct(); echo "MyTrait 构架方法 <br/>"; } /** * @desc: 添加 */ function create() { echo "MyTrait create方法 <br/>"; } }
控制器子类,继承控制器父类 MyBaseController
class MyBaseController { /** * MyBaseController constructor. */ public function __construct() { echo " MyBaseController基类构架方法<br/>"; } /** * @desc: 基类-验证器 */ public function validate() { echo "基类-验证器 <br/>"; } }
调用控制器子类
public function traitsDemo() { $obj = new MyController(); var_dump($obj->validate()); var_dump($obj->create()); var_dump($obj->hello()); }
打印结果
MyBaseController基类构架方法 MyTrait 构架方法 基类-验证器 MyTrait create方法 MyController 子类 hello方法