Maison > cadre php > Laravel > le corps du texte

Vous apprendre à modifier la vérification Laravel FormRequest et à implémenter la vérification de scénario

藏色散人
Libérer: 2020-09-10 11:11:25
avant
3400 Les gens l'ont consulté
Ce qui suit est introduit par

Laravel La colonne du didacticiel présentera la modification de la vérification Laravel FormRequest pour réaliser la vérification de la scène. J'espère que cela sera utile au. amis dans le besoin !

Vous apprendre à modifier la vérification Laravel FormRequest et à implémenter la vérification de scénario

Dans Laravel, de nombreuses interfaces créées et modifiées nécessitent une vérification des données. Il existe généralement deux méthodes pour la vérification des données

  • Utilisez la validation. méthode de requête directement dans le contrôleur

  • Utilisez la classe personnalisée

    FormRequest, qui est intégrée à partir de HttpRequest

    Si vous utilisez la première méthode, ce sera compliqué et pas assez élégant

    Mais si vous utilisez la deuxième méthode, alors un FormRequest doit être défini pour chaque requête

    Par exemple :

    ArticleStoreRequest et ArticleUpdateRequest

    Mais vous constaterez que les règles de validation sont fondamentalement les mêmes. Bien sûr, vous ne pouvez injecter qu'une seule requête dans la méthode du contrôleur, mais s'il existe plusieurs mises à jour pour. un modèle, tel que le module utilisateur, changer le mot de passe/modifier le pseudo/modifier l'avatar/modifier l'adresse/modifier. . . Comment y faire face

    Ainsi, en réponse à cette situation de ces derniers jours, le mécanisme de requête de Laravel a été amélioré et une vérification de scénario a été ajoutée

      Première étape : créer un
    • d'abord La classe de base de 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);
            }
        }
    
    }
    Copier après la connexion
    Étape 2 : Pour la demande de l'utilisateur, il suffit de définir une
  • UserRequest dont hériter de 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处理才能判断是否相同
          ]
      ];
  }
}
Copier après la connexion
    Méthode Controller
  • 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();
        //...
    }
}
Copier après la connexion
Cette méthode ne modifie pas la logique de validation de base de Laravel et autorise uniquement l'injection dans le FormRequest. Ne faites pas de vérification automatique lorsque vous arrivez au contrôleur. Bien sûr, si vous avez besoin d'une vérification automatique, définissez simplement

$autoValidate = true.

Le contenu ci-dessus est uniquement à titre de référence. J'espère un léger spray.

Dans le même temps, j'ai également modifié les règles de vérification de scène d'ORM, qui peuvent être définies fréquemment dans le modèle pour répondre aux besoins de création et de mise à jour de plusieurs scènes en même temps

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!