Руководство
Валидация
Схема валидации, однократная проверка входных данных и повторно используемая логика в отдельном сервисе.
Создайте схему валидации
Используйте ValidationSchema::create(), если схема должна быть явной или повторно используемой. Предпочитайте небольшие встроенные rules.
use Lemonade\Framework\Validation\ValidationSchema;
$schema = ValidationSchema::create()
->field('title', 'Title')
->required()
->maxLength(120)
->end()
->field('published', 'Published')
->required()
->inList(['0', '1'])
->end();Запускайте валидацию один раз
Сначала соберите payload, выполните валидацию один раз и затем принимайте решение по isValid(). Результат предоставляет errors(), failedRules() и validated().
$payload = [
'title' => $this->inputString('title'),
'published' => $this->inputString('published', '0'),
];
$result = $this->validator()->validate($payload, $schema);
if (!$result->isValid()) {
return $this->html(
$this->view()->template('layouts.app', 'pages.article-form', [
'errors' => $result->errors(),
'values' => $payload,
]),
422,
);
}Повторяющуюся валидацию перенесите в сервис
Если одна и та же логика валидации повторяется, перенесите её в отдельный сервис приложения. Skeleton показывает этот подход на контактной форме.
<?php
declare(strict_types=1);
namespace App\Validation;
use Lemonade\Framework\Validation\FormValidation;
use Lemonade\Framework\Validation\ValidationResult;
final class ArticleValidator
{
public function __construct(
private readonly FormValidation $validator,
) {}
/**
* @param array<string, mixed> $data
*/
public function validate(array $data): ValidationResult
{
return $this->validator
->field('title', 'Title')
->required()
->maxLength(120)
->validate($data);
}
}