Formularanforderung in Laravel zerlegen

Hallo allerseits, heute werde ich Ihnen sagen, wie und warum ich die Validierung in Laravel strukturiert habe.





Erinnern wir uns, wie die Formularanforderung funktioniert

Formularanforderung ist eine Klasse, in der wir die Validierungsregeln für eingehende Daten beschreiben. Normalerweise enthält die Klasse eine Reihe von Regeln für die Anforderung vom Client. Wir können es im Controller deklarieren und über den Container in Laravel werden die Daten automatisch gemäß unseren Regeln überprüft und über die internen Mechanismen des Frameworks eine Antwort an den Client gegeben.





Zum Beispiel müssen wir das Benutzerprofil aktualisieren. Die Formularanforderung könnte folgendermaßen aussehen:





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





Bei diesem Ansatz gefällt mir, dass alle Regeln an einem Ort sind. Wir können es sowohl in der Formularanforderung als auch in der normalen Validierung verwenden. Zweitens kann der Klassenname für den Themenbereich aussagekräftiger sein, z. B. ConsumerEmail, SellerPersonalPhone.





Speziell für die Faulen und Neugierigen habe ich ein Repository erstellt . Der Code ist dort ziemlich einfach, so dass Sie ihn einfach selbst anpassen können. Wenn Sie in Ihrer Praxis auf ein ähnliches Problem gestoßen sind, schreiben Sie in die Kommentare, wie Sie es gelöst haben.








All Articles