在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方法