Olá a todos, hoje vou contar como e porque estruturei a validação no Laravel.
Vamos lembrar como funciona o Form Request
Solicitação de formulário é uma classe onde descrevemos as regras de validação para os dados recebidos. Normalmente, a classe contém um conjunto de regras para a solicitação do cliente. Podemos declará-lo no controlador, e através do container no Laravel, ele verificará automaticamente os dados de acordo com nossas regras e, através dos mecanismos internos do framework, dará uma resposta ao cliente.
Por exemplo, precisamos atualizar o perfil do usuário. A solicitação de formulário pode ter a seguinte aparência:
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, .
Com essa abordagem, gosto que todas as regras estejam em um só lugar. Podemos usá-lo tanto no Form Request quanto na validação normal. Em segundo lugar, o nome da classe pode ser mais expressivo para a área de assunto, por exemplo: ConsumerEmail, SellerPersonalPhone.
Especialmente para os preguiçosos e curiosos, criei um repositório . O código é muito simples lá, então você pode adaptá-lo para você mesmo. Se você encontrou um problema semelhante em sua prática, escreva nos comentários como você o resolveu.