Halo semuanya, hari ini saya akan memberi tahu Anda bagaimana dan mengapa saya menyusun validasi di Laravel.
Mari kita ingat cara kerja Permintaan Formulir
Formulir Permintaan adalah kelas tempat kami menjelaskan aturan validasi untuk data yang masuk. Biasanya kelas berisi sekumpulan aturan untuk permintaan dari klien. Kita dapat mendeklarasikannya di controller, dan melalui container di Laravel, secara otomatis akan memeriksa data sesuai dengan aturan kita dan, melalui mekanisme internal framework, akan memberikan respon kepada klien.
Misalnya, kami perlu memperbarui profil pengguna. Formulir Permintaan mungkin terlihat seperti ini:
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, .
Dengan pendekatan ini, saya suka bahwa semua aturan ada di satu tempat. Kita dapat menggunakannya baik dalam Permintaan Formulir maupun dalam validasi normal. Kedua, nama class bisa lebih ekspresif untuk subject area, misal: ConsumerEmail, SellerPersonalPhone.
Khusus untuk yang malas dan penasaran, saya buatkan repositori . Kode di sana cukup sederhana, jadi Anda bisa menyesuaikannya sendiri. Jika Anda mengalami masalah serupa dalam latihan Anda, tulis di komentar bagaimana Anda menyelesaikannya.