Heim  >  Artikel  >  PHP-Framework  >  Erfahren Sie, wie Sie die Laravel FormRequest-Überprüfung ändern und die Szenarioüberprüfung implementieren

Erfahren Sie, wie Sie die Laravel FormRequest-Überprüfung ändern und die Szenarioüberprüfung implementieren

藏色散人
藏色散人nach vorne
2020-09-10 11:11:253466Durchsuche

Tutorial-Kolumne überprüft wird. Ich hoffe, dass es für die Freunde in Not hilfreich sein wird!

In Laravel erfordern viele erstellte und bearbeitete Schnittstellen eine Datenüberprüfung. Es gibt im Allgemeinen zwei Methoden zur Datenüberprüfung.

Erfahren Sie, wie Sie die Laravel FormRequest-Überprüfung ändern und die Szenarioüberprüfung implementieren

Verwenden Sie die Validierungsmethode von Request direkt im Controller.

  • Verwenden Sie eine benutzerdefinierte

    FormRequest-Klasse , das aus
  • HttpRequest
  • integriert ist. Wenn Sie die erste Methode verwenden, wird es chaotisch und nicht elegant genug. Aber wenn Sie die zweite Methode verwenden, müssen Sie für jede Anfrage eine FormRequest definieren.

    Zum Beispiel:

    ArticleStoreRequest

    und

    ArticleUpdateRequest

    Aber Sie werden feststellen, dass die Validierungsregeln im Grunde dieselben sind. Natürlich können Sie nur eine Anforderung in die Controller-Methode einfügen, aber wenn es mehrere Anforderungen für ein Modell gibt Benutzermodul, Passwort ändern/Nickname ändern/Avatar ändern/Adresse ändern/ändern. . . Wie man damit umgehtAls Reaktion auf diese Situation wurde in den letzten Tagen der Anfragemechanismus von Laravel verbessert und eine Szenarioüberprüfung hinzugefügt

    Schritt 1: Erstellen Sie zunächst eine Basisklasse von

    AbstractRequest

      <?php
      
      namespace App\Http\Requests;
      
      use Illuminate\Foundation\Http\FormRequest;
      use Illuminate\Support\Str;
      
      /**
       * 使用方法:
       * Class AbstractRequest
       * @package App\Http\Requests
       */
      class AbstractRequest extends FormRequest
      {
          public $scenes = [];
          public $currentScene;               //当前场景
          public $autoValidate = false;       //是否注入之后自动验证
          public $extendRules;
      
          public function authorize()
          {
              return true;
          }
      
          /**
           * 设置场景
           * @param $scene
           * @return $this
           */
          public function scene($scene)
          {
              $this->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();
          }
      
          /**
           * 根据场景获取规则
           * @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")) {   //合并场景规则
                          $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;
          }
      
          /**
           * 覆盖设置 自定义验证器
           * @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);
              }
          }
      
      }
    • Zweiter Schritt: Für Benutzeranfragen müssen wir nur eine von UserRequest
    • geerbte
    AbstractRequest
    • <?php
      
      namespace App\Http\Requests;
      
      class UserRequest extends AbstractRequest
      {
        public $scenes = [
            &#39;nickname&#39; => 'nickname',
            'avatar' => 'avatar',
            'password' => 'password',
            'address' => 'province_id,city_id'
        ];
      
        public function rules()
        {
            return [        //全部的验证规则
                '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处理才能判断是否相同
                ]
            ];
        }
      }
      Controller-Methode UserController
      <?php
      
      namespace App\Http\Controllers;
      
      use App\Http\Requests\UserRequest;
      
      class UserController
      {
      
          public function register(UserRequest $request)
          {
              $request->validate();   //默认不设置场景 全部验证
              //...
          }
      
          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)
          {
              //设置password场景,只验证password字段,并且使用新的password规则替换原来的password规则
              $request->scene('password')
                  ->with('password')
                  ->validate();
              //...
          }
      }
    • Diese Methode ändert den Kern von Laravel nicht. gültig ationslogik, erlaubt nur die FormRequest soll injiziert werden. Führen Sie keine automatische Überprüfung durch, wenn Sie zum Controller gelangen. Wenn Sie eine automatische Überprüfung benötigen, setzen Sie einfach $autoValidate = true
    • .
      Der obige Inhalt dient nur als Referenz. Hoffe, leichtes Spray.

      Gleichzeitig habe ich auch die Szenenverifizierungsregeln von ORM geändert, die häufig im Modell festgelegt werden können, um den Anforderungen der gleichzeitigen Erstellung und Aktualisierung mehrerer Szenen gerecht zu werden

      Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Sie die Laravel FormRequest-Überprüfung ändern und die Szenarioüberprüfung implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

      Stellungnahme:
      Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen