Руководство

Валидация

Схема валидации, однократная проверка входных данных и повторно используемая логика в отдельном сервисе.

Создайте схему валидации

Используйте ValidationSchema::create(), если схема должна быть явной или повторно используемой. Предпочитайте небольшие встроенные rules.

example.php
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().

example.php
$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 показывает этот подход на контактной форме.

example.php
<?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);
    }
}