Input

Инпут отвечает за входящие данные. Здесь вы можете получить данные из разных источников, таких как:

  1. тело запроса
  2. гет-параметры
  3. адрес эндпоинта
  4. файлы
  5. куки
  6. серверные переменные
  7. хттп заголовки

Создайте файл инпута и реализуйте его от InputInterface.
Добавте необходимые свойства и укажите источники днных в виде аннотаций.
Опишите валидаторы.

Информация

Вы можете не указывать источник данных, если он соответствует методу запроса. Для метогда GET данные будут взяты из get-параметров, для всех остальных из тела запроса.

Пример:

<?php

namespace App\User\Registration;

use Symfony\Component\Validator\Constraint;
use Symfobooster\Base\Input\InputInterface;
use Symfony\Component\Validator\Constraints as Assert;

class RegistrationInput implements InputInterface
{
    public string $email;
    public string $username;

    public function getValidators(): Constraint
    {
        return new Assert\Collection([
            'email' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Email(),
            ],
            'username' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Regex('|^[\w\-\_]+$|'),
                new Assert\Length(['min' => 1, 'max' => 20]),
            ],
        ]);
    }
}

Источники данных

Если метод GET, то по умолчанию данные берутся из гет-параметров. В остальных случаях данные берутся из тела запроса. Если в конкреном случае вам подходит такая логика, то вы можете не указывать источник.
Если источние по-умолчанию не подходит, то вы можете использовать аннтацию Symfobooster\Base\Input\Attributes\Source и указать его явно. В примере ниже мы получаем поле из суперглобального массива _COOKIE.

    #[Source('query')]
    public string $id;

Переименование полей

Переименование полей позволяет разорвать связь между входящими полями и их названиями используемыми в коде. Аннотация Symfobooster\Base\Input\Attributes\Renamed позволяет указать название поле из входящих данных. В примере ниже мы берём куку, которая назвается _ga и кладём в поле $googleId.

    #[Source('cookie')]
    #[Renamed('_ga')]
    public string $googleId;

Эта функция полезна при работе с суперглобальными массивом _SERVER, с куками, с заголовками.

Подавление ошибок валидации

Бывает необходимо скрыть ошибки валидации для некоторых полей от клиента. Для этого необходимо использовать аннотацию Symfobooster\Base\Input\Attributes\Muted. Благодаря ей если поле не прошло валидацию будет выдан код 400, но в ответе не будет сообщения о валидации для этого поля.

    #[Source('server')]
    #[Renamed('HTTP_REFERER')]
    #[Muted]
    public string $referer;

Вложенные инпуты

Если у вас сложная форма запроса, например пир создании какой-то модели у которой много полей, которые нужно удобно структурировать, то вы можете вкладывать объекты друг в друга. Просто используйте типизацию для обозначения, что это свойство должно быть объектом.

Рассмотрим пример двух инпутов, когда один вложен в другой.

<?php

namespace App\Product\Create;

use Symfony\Component\Validator\Constraint;
use Symfobooster\Base\Input\InputInterface;
use Symfony\Component\Validator\Constraints as Assert;

class Product implements InputInterface
{
    public string $name;
    public int $price;
    public Image $image;

    public function getValidators(): Constraint
    {
        return new Assert\Collection([
            'email' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Email(),
            ],
            'price' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Type('int'),
                new Assert\Length(['min' => 1]),
            ],
            'image' => [
                new Assert\Required(),
                new Assert\NotNull(),
            ],
        ]);
    }
}

И модель изображения:

<?php

namespace App\Product\Create;

use Symfony\Component\Validator\Constraint;
use Symfobooster\Base\Input\InputInterface;
use Symfony\Component\Validator\Constraints as Assert;

class Image implements InputInterface
{
    public string $src;
    public string $description;

    public function getValidators(): Constraint
    {
        return new Assert\Collection([
            'src' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Url(),
            ],
            'description' => [
                new Assert\Required(),
                new Assert\NotNull(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 3, 'max' => 1000]),
            ],
        ]);
    }
}

Тело запроса для таких инпутов будет выглядеть так:

{
  "name": "Awesome elephant",
  "price": 10000,
  "image": {
    "src": "https://awesome-site.com/pictures/awesome-elephant.png",
    "description": "Awesome elephant"
  }
}

Валидация

Для осущетвления валидации входящих данных используется пакет Symfony ValidationОткрыть в новом окне