BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Валидация Request $request?

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

Сделать что-то в стиле Laravel
https://laravel.com/docs/5.5/validation#creating-f...
Надо будет так же дописывать кучу правил, ибо судя по всему Symfony ваще пофигу на то как там валидация и авторизация делаеться, пускай другие лепят все сами с нуля, или бандлы и пакеты.

То есть, принимать не Request, а уже проверенный DoSmthRequest.
public function registerNewUser(CreqteNewUserRequest $request)


Без всяких дополнительных вызовов внутри метода, на валидацию данных. По типу массив, и мы туда лепим new NotNull() и еще десяток правил
'some_field_goes_here' => new Rulle(), new Rulle(), new Rulle(), new Rulle(), new Rulle(),  new Rulle(), new Rulle(), new Rulle(), new Rulle(), new Rulle(),
неоч выглядит, да?
А если еще кастомные добавить...
  • Вопрос задан
  • 497 просмотров
Решения вопроса 2
voronkovich
@voronkovich
Request - это обертка HTTP запроса. HTTP запрос может быть не валидным, если он неправильно составлен: некорректное значение заголовка и т.д., он не имеет отношения к бизнес-логике (не верно указан email в форме и т.д.). На мой взгляд, то что сделано в Laravel (если это правда, подчеркну, что я не знаю его!) - безумие.

Рекомендую посмотреть на группы валидации, возможно, это то что вам нужно: How to Apply only a Subset of all Your Validation ....
Ответ написан
BoShurik
@BoShurik
Symfony developer
Дополню voronkovich

https://symfony.com/doc/current/controller/argumen...

class NewUserRequestResolver implements \Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface
{
    /**
     * @var \Symfony\Component\Serializer\SerializerInterface
     */
    private $serializer;

    /**
     * @var \Symfony\Component\Validator\Validator\ValidatorInterface
     */
    private $validator;

    public function __construct(
        \Symfony\Component\Serializer\SerializerInterface $serializer,
        \Symfony\Component\Validator\Validator\ValidatorInterface $validator
    ) {
        $this->serializer = $serializer;
        $this->validator = $validator;

    }

    /**
     * @inheritDoc
     */
    public function supports(\Symfony\Component\HttpFoundation\Request $request, \Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata $argument)
    {
        return NewUserRequest::class === $argument->getType();
    }

    /**
     * @inheritDoc
     */
    public function resolve(\Symfony\Component\HttpFoundation\Request $request, \Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata $argument)
    {
        $newUserRequest = $this->serializer->deserialize($request->getContent(), NewUserRequest::class,'json');
        $constraints = $this->validator->validate($newUserRequest);
        if ($constraints->count() == 0) {
            yield $newUserRequest;
        }

        throw new \Symfony\Component\HttpKernel\Exception\BadRequestHttpException();
    }
}


В итоге в контроллере можно будет использовать
public function registerNewUser(CreqteNewUserRequest $request)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Big Fish Москва
от 80 000 до 120 000 руб.
от 100 000 до 150 000 руб.
Деньги Сразу Ростов-на-Дону
от 80 000 руб.
23 февр. 2019, в 03:05
40000 руб./за проект
22 февр. 2019, в 23:23
30000 руб./за проект
22 февр. 2019, в 22:04
1250 руб./за проект