V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
frozenway
V2EX  ›  PHP

使用 thinkphp6.0 时遇到一个报错,请问怎么解决?

  •  
  •   frozenway · 336 天前 · 1381 次点击
    这是一个创建于 336 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是一个验证登录的代码,验证代码为

    <?php
    declare (strict_types = 1);
    
    namespace app\admin\controller;
    
    use think\facade\View;
    use think\Request;
    use app\admin\validate\Login as L;
    use think\exception\ValidateException;
    
    class Login{
        //
        public function index(Request $request){
            if($request->isPost()){
                $data = $request->post();
                $remember = $data['remember'] ?? 0;
                try{
                $result = validate(L::class)->check($data);//halt($result);
                }catch(ValidateException $e){
                    halt($e);
                }
                
            }
            return View::fetch();
        }
    }
    

    验证器的代码为:

    <?php
    declare (strict_types = 1);
    
    namespace app\admin\validate;
    
    use think\Validate;
    
    class Login extends Validate
    {
        /**
         * 定义验证规则
         * 格式:'字段名' =>  ['规则 1','规则 2'...]
         *
         * @var array
         */
        protected $rule = [
            'username' => 'require|alphaNum|max:20',
            'password' => 'require|alphaNum|length:6,16',
        ];
    
        /**
         * 定义错误信息
         * 格式:'字段名.规则名' =>  '错误信息'
         *
         * @var array
         */
        protected $message = [
            'username.require' => '账号不能为空',
            'password.require' => '密码不能为空',
            'username.alphaNum' => '账号只能包含字母和数字',
            'username.max' => '账号字符最大长度为 20',
            'password.alphaNum' => '密码只能包含字母和数字',
            'password.length' => '密码的长度为 6 ~ 16',
        ];
    }
    
    

    执行后报这个错误,请问是哪里出了问题?

    #0 [0]Error in Validate.php line 1600
    Call to a member function has() on null
         * @param string $msg   错误信息
         * @param mixed  $rule  验证规则数据
         * @param string $title 字段描述名
         * @return string|array
         */
        protected function parseErrorMsg(string $msg, $rule, string $title)
        {
            if (0 === strpos($msg, '{%')) {
                $msg = $this->lang->get(substr($msg, 2, -1));
            } elseif ($this->lang->has($msg)) {
                $msg = $this->lang->get($msg);
            }
    
            if (is_array($msg)) {
                return $this->errorMsgIsArray($msg, $rule, $title);
            }
    
            // rule 若是数组则转为字符串
            if (is_array($rule)) {
            ```
    11 条回复    2021-06-19 16:15:48 +08:00
    frozenway
        1
    frozenway  
    OP
       336 天前
    这里有 thinkphp 的官方大佬在吗?
    justrand
        2
    justrand  
       336 天前
    错误信息不是说了么:function has() on null
    那你看下走到这个函数的时候,$msg 传了啥过去了。
    jay4497
        3
    jay4497  
       336 天前
    $this->lang 这个 lang 没有初始化吧
    jay4497
        4
    jay4497  
       336 天前
    帮你召唤大佬
    @topthink
    littleylv
        5
    littleylv  
       336 天前
    @justrand #2
    Call to a member function has() on null 说的并不是 has 的参数$msg 有问题,而是调用 has 的实例$this->lang 是 null
    frozenway
        6
    frozenway  
    OP
       336 天前
    @littleylv 是 null,但是不清楚为什么是 null
    frozenway
        7
    frozenway  
    OP
       336 天前
    @jay4497 这个 lang 是 topthink 的框架内核文件,也没法改
    ben1024
        8
    ben1024  
       336 天前
    @frozenway
    1.增加下挂载语言包试下,
    2.设置默认语言中文
    3.修改提示为英文(作用不大)

    应该使用了其他语言触发了语言包翻译
    qwertyzzz
        9
    qwertyzzz  
       336 天前
    目测要安装啥包 topthink\xxx 包,现在好多功能都分开包了
    abccccabc
        10
    abccccabc  
       335 天前
    楼主,转 go 语言呀。现在 php 的入门门槛越来越高了。
    myd
        11
    myd  
       335 天前
    建议弃坑,thinkphp6 文档错漏、bug 很多
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1662 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:31 · PVG 08:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.