代码之家  ›  专栏  ›  技术社区  ›  Kenny Horna

忽略自定义验证规则的passes()函数

  •  0
  • Kenny Horna  · 技术社区  · 6 年前

    我不知道是我睡眠不足还是遗漏了一些明显的东西,但我遇到了这个问题:我创建了一个自定义验证规则,需要通过构造函数传递一个请求值来执行验证。

    这是我的设置:

    自定义验证规则

    /** Rules/RouteValidationRule.php */
    
    namespace App\Rules;
    
    use Illuminate\Contracts\Validation\Rule;
    
    class RouteValidationRule implements Rule {
    
        private $action;
    
        public function __construct(string $action)
        {
            $this->action = $action; // doing dd($action) output the correct value.
        }
    
        // a dd('Hi'); inside here is just ignored:
        public function passes($attribute, $value)
        {
            if ($this->action === 'complete')
                return (isset($value['delivery_route']))
                    && (count($value['delivery_route']) >= 2);
            else
                return true;
        }
    
        public function message() { /** */ }
    }
    

    表格请求

    /** UpdateOrderRequest.php */
    
    namespace App\Http\Requests;
    
    use App\Rules\OrderStatusesRule;
    use App\Rules\RouteValidationRule;
    use Illuminate\Foundation\Http\FormRequest;
    
    class UpdateOrderRequest extends FormRequest {
    
        public function authorize() { /** */ }
    
        public function rules() 
        {
            return [
                'action' => ['required', new OrderStatusesRule],
                'meta.delivery_route' => [
                    'array',
                    new RouteValidationRule($this->get('action')), // <---
               ],
            ];
        }
    }
    

    但问题是,值正在到达自定义规则构造函数,但它没有到达 passes() 方法,它只是忽略了这一点,继续下去,好像这是好的。

    警察:我已经检查了每一步 dd() .

    提前谢谢。


    更新

    /** MyController.php */
    
        /**
         * @param UpdateOrderRequest $request
         * @return mixed
         */
        public function handle(UpdateOrderRequest $request) // the RequestForm is injected
        {
            dd('I passed');  // <-- is reaching this statement when it shouldn't
        }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Tacsiazuma    6 年前

    我拼凑了一个类似的解决方案,发现如果要验证的字段不存在,它只会忽略验证(除非在需要时还作为验证规则添加):

    Route::any('/', function (UpdateOrderRequest $orderRequest) {
        dd($orderRequest);
    });
    

     public function passes($attribute, $value)
        {
            dd('pass');
            if ($this->action === 'complete')
                return (isset($value['delivery_route']))
                    && (count($value['delivery_route']) >= 2);
            else
                return true;
        }
    

    然后向邮递员发出请求:

    POST / HTTP/1.1
    Host: localhost:8888
    Content-Type: application/json
    cache-control: no-cache
    Postman-Token: 848f7181-2c28-46a5-b508-4cb35083315e
    {
        "action" : "something",
        "meta" : {
            "delivery_route" : "something else"
        }
    }------WebKitFormBoundary7MA4YWxkTrZu0gW--
    

    它遇到了passes方法并回显了pass。然后我重新命名了上面的“传送路径”,它最终进入了控制器。

    默认情况下,当正在验证的属性不存在或 包含空字符串、常规验证规则,包括自定义 扩展,不运行。

        2
  •  0
  •   keyboardSmasher    6 年前

    规则不运行的原因是您正在测试的属性不在 Request ImplicitRule Rule 例如。:

    class RouteValidationRule implements ImplicitRule {