Laravelでのフォームリクエストの分解

みなさん、こんにちは。今日は、Laravelで検証を構造化した方法と理由を説明します。





フォームリクエストがどのように機能するかを覚えておきましょう

フォームリクエストは、受信データの検証ルールを説明するクラスです。通常、クラスには、クライアントからの要求に対する一連のルールが含まれています。コントローラで宣言でき、Laravelのコンテナを介して、ルールに従ってデータを自動的にチェックし、フレームワークの内部メカニズムを介してクライアントに応答します。





たとえば、ユーザープロファイルを更新する必要があります。フォームリクエストは次のようになります。





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





このアプローチでは、すべてのルールが1か所にあるのが好きです。フォームリクエストと通常の検証の両方で使用できます。次に、クラス名は、たとえば、ConsumerEmail、SellerPersonalPhoneのように、サブジェクト領域をより表現しやすくすることができます。





特に怠惰で好奇心旺盛な人のために、私はリポジトリを作成しましたコードは非常に単純なので、自分に合わせて調整することができます。練習中に同様の問題が発生した場合は、どのように解決したかをコメントに書き込んでください。








All Articles