zoukankan      html  css  js  c++  java
  • PHP Lumen Laravel 解决validate方法自定义message无效的问题

      /**
         * 由于 LaravelLumenRoutingProvidesConvenienceMethods::validate 在验证不通过时,
         * 抛出 IlluminateValidationValidationException 异常时,message字段用的是固定的 => 'The given data was invalid.'
         * 且 AppExceptionsHandler::handler 只输出了异常的message字段,
         * 故自定义错误信息输出json时无法自定义
         *
         * 这个方法在 validate 方法基础上修改,在验证不通过时抛出 AppExceptionsValidationException ,
         * message为错误堆栈中的第一条信息
         *
         * demo
         * $params = $this->validateFilter($request, [
         *     'id' => 'required|string'
         * ],[
         *     'id.required' => 'id必须传'
         * ]);
         *
         * @param Request $request
         * @param array $rules
         * @param array $messages
         * @param array $customAttributes
         * @return array
         * @throws ValidationException
         */
        public function validateMsg(Request $request, array $rules, array $messages = [], array $customAttributes = [])
        {
            $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
    
            if ($validator->fails()) {
                throw new ValidationException($validator->errors()->first());
            }
    
            return $this->extractInputFromRules($request, $rules);
        }

      /**
         * 调用 AppHttpControllersLapBaseController::validateMsg 方法
         * 并且只保留在$rules的key中存在的key,且过滤值为空字符串的数据
         * @param Request $request
         * @param array $rules
         * @param array $messages
         * @param array $customAttributes
         * @return array
         * @throws ValidationException
         */
        public function validateFilter(Request $request, array $rules, array $messages = [], array $customAttributes = [])
        {
            $this->validateMsg($request, $rules, $messages, $customAttributes);
            // 只保留在$rules的key中存在的key
            $rs = collect($request->all())->only(array_keys($rules))->toArray();
            // 过滤值为空字符串的数据
            return array_filter($rs, function ($item) {
                return $item !== "";
            });
        }

    将这两个方法放到 AppHttpControllersController 中,
    或者自己新建一个BaseController extent AppHttpControllersController

    validateMsg 解决了错误信息不会放大异常的message字段的问题,

    validateFilter 则是再进一步的包装,只返回验证规则配置的字段,且过滤值为空字符串的键值对

    参考:
    https://learnku.com/docs/laravel/5.7/validation/2262

  • 相关阅读:
    WebForms和MVC之间的抉择
    RPM install Error: Failed dependencies
    存储NAS和SAN
    python基础31[visualstudio2010来编写python程序]
    Linux系统性能检测
    perl的引用和>
    Linux内存高级 [swap/buffer]
    python类库26[web2py的URL映射]
    python类库31[python的libpath]
    VShpere中创建新Linux(ubuntu)的virtual machine
  • 原文地址:https://www.cnblogs.com/lzs-888/p/11463451.html
Copyright © 2011-2022 走看看