Solicitud de formulario de descomposición en Laravel

Hola a todos, hoy les cuento cómo y por qué estructuré la validación en Laravel.





Recordemos cómo funciona Form Request

Form Request es una clase en la que describimos las reglas de validación para los datos entrantes. Por lo general, la clase contiene un conjunto de reglas para la solicitud del cliente. Podemos declararlo en el controlador, y a través del contenedor en Laravel, automáticamente verificará los datos de acuerdo con nuestras reglas y, a través de los mecanismos internos del framework, dará respuesta al cliente.





Por ejemplo, necesitamos actualizar el perfil de usuario. La solicitud de formulario podría verse así:





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, .





Con este enfoque, me gusta que todas las reglas estén en un solo lugar. Podemos usarlo tanto en Form Request como en validación normal. En segundo lugar, el nombre de la clase puede ser más expresivo para el área temática, por ejemplo: ConsumerEmail, SellerPersonalPhone.





Especialmente para los perezosos y curiosos, creé un repositorio . El código es bastante simple allí, por lo que puede adaptarlo usted mismo. Si ha encontrado un problema similar en su práctica, escriba en los comentarios cómo lo resolvió.








All Articles