みなさん、こんにちは。今日は、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のように、サブジェクト領域をより表現しやすくすることができます。
特に怠惰で好奇心旺盛な人のために、私はリポジトリを作成しました。コードは非常に単純なので、自分に合わせて調整することができます。練習中に同様の問題が発生した場合は、どのように解決したかをコメントに書き込んでください。