• 海南省委常委张韵声任宁夏回族自治区党委政法委书记 2019-04-24
  • 苹果市值9370亿美元 在标普500成分股中占比为4% 2019-04-24
  • 2018年度国际发动机奖揭晓 法拉利V8蝉联冠军 2019-04-18
  • 伊拉克和以色列“环球小姐”在自拍合影争议后重聚 2019-04-12
  • 对于马克思主义者来说,什么也不值得惋惜,历史教训才值得的总结 2019-04-12
  • 设计师默默吐槽的这些话 你想听吗 2019-04-08
  • 张德江:着力深化和拓展代表工作,充分发挥代表作用 2019-04-08
  • 持续发力!又有三家微信公众号被吕梁市网信办约谈 2019-03-29
  • “马克思主义在中国早期传播陈列馆”开馆仪式在京举办 2019-03-29
  • 吴晓球中国金融最具增长功能 2019-03-24
  • (受权发布)中国人民政治协商会议第十三届全国委员会副秘书长任命名单 2019-03-24
  • Mazda3 掀背車贏得 Strategic Vision 全面品質大獎 2019-03-21
  • 最新数据杭州就业满意度全国排第二 吸引力提升 2019-03-21
  • 回复@老老保老张工:那只能证明你的智商不达标!对于计划经济的构想,咱敢说强坛没有一个人比咱考虑得更周全!伪高工排在一个筋斗云之外! 2019-03-19
  • 千军一呼战疆场, 强军砺剑中国梦(阅军纪实) 2019-03-19
  • 在路由中使用验证器的问题

    浏览:925 发布日期:2019/02/27
    5.0.0 - 普通 - 未处理
    这应该不算是一个程序错误,严格来说应该数据逻辑没处理好或者思考好的结果

    我在这里要特别强调的是这是一篇非常符合逻辑并且非常严谨的方案,希望官方或者其他使用者能够重视,请不要无脑表水,为什么不将这些内容放到控制器之类等等。
    我在我的路由中使用了中间件, 并且使用了验证器。
    中间件中对于数据的返回结果,可以手动控制,并且可以json或者html。
    但是在验证器中的结果,我却无法去控制他,这是我第一次尝试在路由中直接使用验证器,觉得可能会方便,但最终发现不管程序怎么跑,都无法得到预期的json返回内容。

    每次返回
    【如果是html返回】都是抛出异常之后的结果
    【如果是json返回】都是404或者500的问题,如何才能拿到结果始终不清楚。

    或者说我也设置不了返回内容,希望官方尽快解决类似这样的问题,我现在需要把我的验证在改回控制器。

    我在网上也大概查找了下 ,发现有一些用户有同样的问题,单最后解决方法都不是最终想要的样子。应为都是吧所有抛出异常的部分json 话,但我想要的仅仅是验证结果的一个的显示。

    下面是我的路由代码Route::group('admin',
            function ()
            {
                // 首页登录页
                Route::get('login', 'admin/Login/index'); 
                // 账号登录请求
                Route::post('accountLogin', 'admin/Login/accountLogin')->middleware('app\admin\middleware\Login')->validate('app\admin\validate\Login','account');
                // 手机登录请求
                Route::post('phoneLogin', 'admin/Login/phoneLogin')->middleware('app\admin\middleware\Login')->validate('app\admin\validate\Login','phone');
                // 邮件登录请求
                Route::post('emailLogin', 'admin/Login/emailLogin')->middleware('app\admin\middleware\Login')->validate('app\admin\validate\Login','email');
            }
        );
    我在 config 目录进行了 App下的配置    // 默认输出类型
        'default_return_type'    => 'josn',
        // 默认AJAX 数据返回格式,可选json xml ...
        'default_ajax_return'    => 'json',
    并且在验证器中进行了如下代码操作namespace app\admin\validate;
    use think\Validate;
    use app\facade\WebTool;
    class Login extends Validate
    {
        /**
         * 用户信息数据
         * 将用户信息存储到这里等待后续调用
         * @var array
         */
        private static $user;

        protected $rule = 
        [
            'user' => 'require|regex:[a-zA-Z][\w]{5,31}|checkUser',
            'pass' => 'require|length:6,24|passIsCorrect',
            'agreement'    => 'require|boolean',
            'remember' => 'require|boolean',
            'email' => 'require|email|checkUser',

        ];
        
        protected $message = 
        [
            // 账号信息
            'user.request' => 'User_Must_Input',
            'user.regex' => 'User_Format_Error',

            // 密码信息
            'pass.require' => 'Pass_must_Input',
            'pass.length' => 'Pass_Length_Exceed',

            // 记住我信息
            'keep.require' => 'Remember_Must_Input',
            'keep.boolean' => 'Remember_Format_Error',

            // 协议信息
            'agreement.require' => 'Agreement_Must_Input',
            'agreement.boolean' => 'Agreement_Format_Error',
            
            // 邮件信息
            'email.request' => 'Email_Must_Input',
            'email.email' => 'Email_Format_Error',

        ];

        protected $scene =
        [
            'account' => ['user','pass'],
            'email' => ['email','pass'],
        ];

        // 验证规则分块函数 检测用户是否存在
        protected function checkUser($value,$rule,$data=[])
        {
            // 初始化账户分类选择功能
            $action = '';
            // 检测初始数据
            $check = 'User_Or_Pass_Error';
            // 查验值是否是账号功能 如果是 附能action 账号字符串
            if (preg_match('/[a-zA-z][\w]{5,32}/', $value)) $action = 'user';
            // 查验值是否是电话功能 如果是 附能action 电话字符串
            elseif(preg_match('/[1][3456789][\d]{9}/', $value)) $action = 'phone';
            // 查验值是否是邮件功能 如果是 附能action 邮件字符串
            elseif(preg_match('/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/', $value)) $action = 'email';
            // 查验格式是否错误 虽然多余的一句话 为了完美
            else return 'User_Or_Pass_Error';
            // 查询数据库用户是否存在
            $count = \Db::table('p_admins')->where($action,'=',$value)->count();
            // 如果统计结果大于1说明数据问题返回false (继续做处理则是记录入数据告知后台有多个同名用户)
            if ($count > 1)
            {
                $check = 'User_Or_Pass_Error';
            }
            // 侧则认为数据正常
            else
            {
                // 将查询结果静态到用户变量中等待再次被调用
                self::$user = \Db::table('p_admins')->where($action,'=',$value)->find();
                // 在统计结果中发现是1条数据时则告知检测到该用户
                if ($count == 1)  $check = true;
                // 如果不等于1 则返回false 未检测到数据
                else $check = 'User_Or_Pass_Error';
            }
            // 返回最终结果
            return $check;
        }


        // 验证规则分块函数 检测用户密码是否正确
        protected function passIsCorrect($value,$rule,$data=[])
        {
            // 初始化检测数据
            $check = 'User_Or_Pass_Error';
            // 进行密码加密规则获取
            $pass = WebTool::passRule($value);
            // 用户数据中的密码与之相匹配则认识通过检测
            if (self::$user['pass'] == $pass) $check = true;
            // 否则不通过检测 返回最终结果
            return $check;
        }
    }
    首先!希望官方能够看下这个问题,并且有一定说明,或者更新,最不济告诉我怎么做也是可以的 。
    再次!我个人有以下构思,改造或者使用的思路,请官方还有各位php的爱好者们,进行评价,希望可以得到一定支持。


    我们来看 config文件夹中 app文件内的两个参数     // 默认输出类型
        'default_return_type'    => 'josn',
        // 默认AJAX 数据返回格式,可选json xml ...
        'default_ajax_return'    => 'json',
    这两个参数 可以是html 也可以是json 或者更多 xml 等等
    那么 我在需要使用json作为返回内容的时候,我的config 文件目录内的内容是可以全局都读取到的
    那么剩下的问题就是官方核心的类库中,在官方的think文件夹内的验证类,是不是就可以获取到他们的参数
    如果这个时候我们加入 是否 json 返回的判断 或者是html 等等 如果是 某种类型的判断
    我们按照响应的内容在验证器中做如下操作
    1 构建一个新的对应属性 我在这里 拿json 进行举例

    我认为用这种json属性 去替代 message这个属性 来对ajax 的请求json做直接操作,这种方式而 json 里面的值 是用户自己约定的一套,不用去限制,这样是否能解决所有问题
    官方只需要控制好code,msg,以及data必须出现就行,至于其他的不去做限制 这样 就能把所有的内容链接起来并且,有效的使用,最重要的我认为这种方式会提高系统安全性与提升性能    // 并且如果开启的情况下 在用户自定义的验证类中会多出一个使用情况 去指定json返回内容
        // 在json 中 这样填写  就符合了所有人 所有的业务逻辑需求
        protected $json=
        [
            'pass.request' => ['code'=>200,'data'=>false,msg=>'Pass_must_Input','更多'=>'内容'],
            'pass.length' =>['code'=>200,'data'=>false,msg=>'Pass_Length_Exceed','更多'=>'内容'],
        ]
    2 在用户自定义的规则函数内 我认为应该统一返回格式【true 或者false】 而不是 【true 或者 错误的自定义消息】
    应为在 json 返回中,这个自定义函数如果依然这么做 是不好去控制,也不好识别的一种内容。

    如果是true或者 false,官方需要做的事情,就是检测用户自定义规则是否是false ,如果是搜索消息内的对应规则内容。
    我们同样可以在json这个属性里面这么做,这样的做的好处 不仅仅是统一了规则也对json或者 html 或者 xml 等返回内容大有益处
    而使用了这种方案 官方可以轻松控制到数据中的消息与任何地方对接上。    // 验证规则分块函数 检测用户密码是否正确
        protected function passIsCorrect($value,$rule,$data=[])
        {
            // 初始化检测数据 废弃直接返回消息
            $check = 'User_Or_Pass_Error';
            // 将返回结果改为 false 废弃消息
            $check = false
            // 进行密码加密规则获取
            $pass = WebTool::passRule($value);
            // 用户数据中的密码与之相匹配则认识通过检测
            if (self::$user['pass'] == $pass) $check = true;
            // 否则不通过检测 返回最终结果
            return $check;
        }

        protected $message = 
        [
            // 账号信息
            'pass.require' => 'Pass_must_Input',
            'pass.length' => 'Pass_Length_Exceed',
            //在消息中 对自定义规则,进行内容填写
            'pass.passIsCorrect' => 'User_Or_Pass_Error',
        ];
        // 或者
        protected $json=
        [
            'pass.request' => ['code'=>200,'data'=>false,msg=>'Pass_must_Input','更多'=>'内容'],
            'pass.length' =>['code'=>200,'data'=>false,msg=>'Pass_Length_Exceed','更多'=>'内容'],
            //在消息中 对自定义规则,进行内容填写
            'pass.passIsCorrect' => ['code'=>302,'data'=>false,msg=>'User_Or_Pass_Error','更多'=>'内容'],
        ]
    评论(
    后面还有条评论,点击查看>>
  • 海南省委常委张韵声任宁夏回族自治区党委政法委书记 2019-04-24
  • 苹果市值9370亿美元 在标普500成分股中占比为4% 2019-04-24
  • 2018年度国际发动机奖揭晓 法拉利V8蝉联冠军 2019-04-18
  • 伊拉克和以色列“环球小姐”在自拍合影争议后重聚 2019-04-12
  • 对于马克思主义者来说,什么也不值得惋惜,历史教训才值得的总结 2019-04-12
  • 设计师默默吐槽的这些话 你想听吗 2019-04-08
  • 张德江:着力深化和拓展代表工作,充分发挥代表作用 2019-04-08
  • 持续发力!又有三家微信公众号被吕梁市网信办约谈 2019-03-29
  • “马克思主义在中国早期传播陈列馆”开馆仪式在京举办 2019-03-29
  • 吴晓球中国金融最具增长功能 2019-03-24
  • (受权发布)中国人民政治协商会议第十三届全国委员会副秘书长任命名单 2019-03-24
  • Mazda3 掀背車贏得 Strategic Vision 全面品質大獎 2019-03-21
  • 最新数据杭州就业满意度全国排第二 吸引力提升 2019-03-21
  • 回复@老老保老张工:那只能证明你的智商不达标!对于计划经济的构想,咱敢说强坛没有一个人比咱考虑得更周全!伪高工排在一个筋斗云之外! 2019-03-19
  • 千军一呼战疆场, 强军砺剑中国梦(阅军纪实) 2019-03-19
  • 老k德州扑克 生肖时时彩投注技巧 3d绝杀号公式 p3试机号专家预测 全国彩票走势图 竞彩篮球大小分的规则 幸运飞艇是晚上几点结束 加拿大快乐8开奖和值 111彩票网提现会出问题 728彩票官网正规吗 安徽时时彩怎么看不到 福利彩票官网 网易彩票40送118 广东11选5 七乐彩预测专家 北京pk10计划50期连中