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