Demande de formulaire de décomposition dans Laravel

Bonjour à tous, aujourd'hui je vais vous dire comment et pourquoi j'ai structuré la validation dans Laravel.





Rappelons-nous comment fonctionne la demande de formulaire

Form Request est une classe dans laquelle nous décrivons les règles de validation des données entrantes. Habituellement, la classe contient un ensemble de règles pour la demande du client. Nous pouvons le déclarer dans le contrôleur, et via le conteneur de Laravel, il vérifiera automatiquement les données conformément à nos règles et, à travers les mécanismes internes du framework, donnera une réponse au client.





Par exemple, nous devons mettre à jour le profil utilisateur. La demande de formulaire peut ressembler à ceci:





namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateUserProfile extends FormRequest
{
	public function rules(): array
  {
   return [
		'email' => ['required', 'email'],
		'name'  => ['required', 'alpha'],
		'age'   => ['integer', 'max:120'],
	 ];
  }
	
	public function messages():array
	{
		return [
		 'email.required' => 'Email   email'
		];
	}
}
      
      



. . Form Request ...





, , . .





, . - "mail ". , , .





Form Request ?

Form Request .





  • Form Request . ( ). , . ( ) .





  • . "Don't repeat yourself". ( ), .





public function store(Request $request)
{
	$validated = $request->validate([
		'email' => ['required', 'email']
  ]);
}
      
      



, (field) ValidatorValue.





Form Request.





class UpdateUserProfile extends FormRequestDecompose
{
	public function rules(): array
  {
   return [
		new UserEmail(auth()->user()->id),
		new UserName(),
		new UserAge(),
	 ];
  }
}
      
      



  • FormRequestDecompose, ValidatorValue.





  • , .





  • ( )





?

ValidatorValue. . , , . getRules , getMessages ( ).





class UserEmail implements ValidatorValue
{
	private $attribute;
	
	private $exceptUserId;
  
  public function __construct(int $userId, string $attribute = 'email')
	{
		$this->exceptUserId = $userId;
		$this->attribute = $attribute;
	}

	public function getAttribute(): string
	{
		return $this->attribute;
	}
	
	    public function getRules(): array
    {
        return [
            'required',
            'email',
            "unique:users,email,{$this->exceptUserId}",
        ];
    }

    public function getMessages(): array
    {
        return [
            "{$this->attribute}.email"         => ',   email',
            "{$this->attribute}.required"      => ',  email',
            "{$this->attribute}.unique"        => 'Email  '
        ];
    }
}
      
      



interface ValidatorValue
{
    /**
     * Should return list rules
     * @example ['required','email','unique:users,email'];
     * @return array
     */
    public function getRules(): array;

    /**
     * @return string
     */
    public function getAttribute(): string;

    /**
     * @return array
     */
    public function getMessages(): array;
}
      
      



?





Laravel BotMan, Laravel.

, Facade . .





$validatorUserEmail = UserEmail(auth()->user()->id); 
$this->validator = Validator::make([
		$validatorUserEmail->getAttribute() => $answerFromUser
],[
	$validatorUserEmail->getAttribute() => $validatorUserEmail->getRules()
],
	$validatorUserEmail->getMessages());
if ($this->validator->fails() === false) {
		// ...
}
      
      



, .

:





if ($this->validate($answer->getText(), new UserEmail($this->user->id)) {
   // ...
}
      
      



, , FormRequestDecompose, .





Avec cette approche, j'aime que toutes les règles soient réunies au même endroit. Nous pouvons l'utiliser à la fois dans Form Request et en validation normale. Deuxièmement, le nom de la classe peut être plus expressif pour le domaine, par exemple: ConsumerEmail, SellerPersonalPhone.





Surtout pour les paresseux et curieux, j'ai créé un référentiel . Le code est assez simple là-bas, vous pouvez donc l'adapter vous-même. Si vous avez rencontré un problème similaire dans votre pratique, écrivez dans les commentaires comment vous l'avez résolu.








All Articles