真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

教你修改LaravelFormRequest驗證,實現(xiàn)場景驗證

下面由Laravel教程欄目給大家介紹修改Laravel FormRequest驗證,實現(xiàn)場景驗證,希望對需要的朋友有所幫助!

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的沙河網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在Laravel 中,很多創(chuàng)建和編輯的的接口都是需要做數(shù)據(jù)驗證的,對于數(shù)據(jù)驗證一般有2種方方式

在控制器里直接使用Request的validate方法

使用自定義FormRequest類,該類集成自Http\\Request

如果使用第一種方法,會比較亂,看起來不夠優(yōu)雅

但是如果使用第二種方式,那么針對每一種請求都要定義一個FormRequest

比如:ArticleStoreRequest和ArticleUpdateRequest

但是你會發(fā)現(xiàn)基本上驗證規(guī)則是一樣的,當(dāng)然你可以在控制器方法里只注入一個Request,但是如果針對于一個Model 有多個Update的那種,比如用戶模塊,修改密碼/修改昵稱/修改頭像/修改地址/修改。。。怎么處理呢

所以這幾天針對這種情況,改進了下Laravel的Request機制,加了一個場景驗證

第一步:先創(chuàng)建一個AbstractRequest的基類
currentScene = $scene;
        return $this;
    }

    /**
     * 使用擴展rule
     * @param string $name
     * @return AbstractRequest
     */
    public function with($name = '')
    {
        if (is_array($name)) {
            $this->extendRules = array_merge($this->extendRules[], array_map(function ($v) {
                return Str::camel($v);
            }, $name));
        } else if (is_string($name)) {
            $this->extendRules[] = Str::camel($name);
        }

        return $this;
    }

    /**
     * 覆蓋自動驗證方法
     */
    public function validateResolved()
    {
        if ($this->autoValidate) {
            $this->handleValidate();
        }
    }

    /**
     * 驗證方法
     * @param string $scene
     * @throws \\Illuminate\\Auth\\Access\\AuthorizationException
     * @throws \\Illuminate\\Validation\\ValidationException
     */
    public function validate($scene = '')
    {
        if ($scene) {
            $this->currentScene = $scene;
        }
        $this->handleValidate();
    }

    /**
     * 根據(jù)場景獲取規(guī)則
     * @return array|mixed
     */
    public function getRules()
    {
        $rules = $this->container->call([$this, 'rules']);
        $newRules = [];
        if ($this->extendRules) {
            $extendRules = array_reverse($this->extendRules);
            foreach ($extendRules as $extendRule) {
                if (method_exists($this, "{$extendRule}Rules")) {   //合并場景規(guī)則
                    $rules = array_merge($rules, $this->container->call(
                        [$this, "{$extendRule}Rules"]
                    ));
                }
            }
        }
        if ($this->currentScene && isset($this->scenes[$this->currentScene])) {
            $sceneFields = is_array($this->scenes[$this->currentScene])
                ? $this->scenes[$this->currentScene] : explode(',', $this->scenes[$this->currentScene]);
            foreach ($sceneFields as $field) {
                if (array_key_exists($field, $rules)) {
                    $newRules[$field] = $rules[$field];
                }
            }
            return $newRules;
        }
        return $rules;
    }

    /**
     * 覆蓋設(shè)置 自定義驗證器
     * @param $factory
     * @return mixed
     */
    public function validator($factory)
    {
        return $factory->make(
            $this->validationData(), $this->getRules(),
            $this->messages(), $this->attributes()
        );
    }

    /**
     * 最終驗證方法
     * @throws \\Illuminate\\Auth\\Access\\AuthorizationException
     * @throws \\Illuminate\\Validation\\ValidationException
     */
    protected function handleValidate()
    {
        if (!$this->passesAuthorization()) {
            $this->failedAuthorization();
        }
        $instance = $this->getValidatorInstance();
        if ($instance->fails()) {
            $this->failedValidation($instance);
        }
    }

}
第二步:針對用戶Request,我們只需要定義一個UserRequest繼承AbstractRequest
 'nickname',
      'avatar' => 'avatar',
      'password' => 'password',
      'address' => 'province_id,city_id'
  ];

  public function rules()
  {
      return [        //全部的驗證規(guī)則
          'mobile' => [],
          'nickname' => [],
          'password' => [
              'required', 'min:6', 'max:16'
          ],
          'avatar' => [],
          'province_id' => [],
          'city_id' => [],
          //...
      ];
  }

  public function passwordRules()
  {
      return [
          'password' => [
              'required', 'min:6', 'max:16', 'different:$old_password'      //修改新密碼不和舊密碼相同,此處只是舉例子,因為密碼需要Hash處理才能判斷是否相同
          ]
      ];
  }
}
控制器方法 UserController
validate();   //默認不設(shè)置場景 全部驗證
        //...
    }

    public function updateAddress($id, UserRequest $request)
    {
        $request->scene('address')->validate();
        //...
    }

    public function updateAvatar($id, UserRequest $request)
    {
        $request->validate('avatar');
        //...
    }

    public function updatePassword($id, UserRequest $request)
    {
        //設(shè)置password場景,只驗證password字段,并且使用新的password規(guī)則替換原來的password規(guī)則
        $request->scene('password')
            ->with('password')
            ->validate();
        //...
    }
}

該方法沒有修改Laravel的核心驗證邏輯,只讓在FormRequest在注入到Controller的時候不要做自動驗證,當(dāng)然,如果需要自動驗證,那么設(shè)置$autoValidate = true即可。

以上內(nèi)容僅供參考。望輕噴。

同時還有我也修改了ORM的場景驗證規(guī)則,可以在model里設(shè)置經(jīng)常,同時滿足多場景創(chuàng)建和更新


名稱欄目:教你修改LaravelFormRequest驗證,實現(xiàn)場景驗證
鏈接地址:http://weahome.cn/article/cgjppo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部