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(),
неоч выглядит, да?
А если еще кастомные добавить...
  • Вопрос задан
  • 449 просмотров
Решения вопроса 2
voronkovich
@voronkovich
Request - это обертка HTTP запроса. HTTP запрос может быть не валидным, если он неправильно составлен: некорректное значение заголовка и т.д., он не имеет отношения к бизнес-логике (не верно указан email в форме и т.д.). На мой взгляд, то что сделано в Laravel (если это правда, подчеркну, что я не знаю его!) - безумие.

Рекомендую посмотреть на группы валидации, возможно, это то что вам нужно: How to Apply only a Subset of all Your Validation ....
Ответ написан
BoShurik
@BoShurik
Дополню 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)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы