在路由中使用验证器的问题

浏览:857 发布日期: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','更多'=>'内容'],
    ]
评论(
后面还有条评论,点击查看>>