По хорошему валидацию должен делать реквест
Неа. Request - это просто набор данных.
Тоесть выходит 2 запроса, 1 - через валидаторы фреймворка, а 2 - когда в контроллере или сервисе достаем эту-же запись для дальнейшей работы.
Вы пытаетесь найти единственное правильно место для проверок. По хорошему проверки должны быть во всех методах, даже в приватных. Что-то не так - бросайте исключение. Эта практика на первый взгляд жуткая, но она вас обезопасит от огромнейшего количества ошибок.
Опережая ваш вопрос: "это ж сколько дублировать проверки придется?". Да, много, но поверьте, оно стоит того.
В добавок к этому иногда логика может быть достаточно замысловатой
Если вы пытаетесь в одной точке захватить множество контекстов - безусловно. Если же будете делать
необходимые проверки всюду - эта сложность не возникнет.
Мне не очень нравится идея выносить куски логики в реквест
Мысль здравая.
Соответственно получается неудобная ситуация, когда часть валидации нужно разместить в реквесте, а часть в сервисе.
Не нарушайте SRP.
<?php
namespace Vendor\Project\AppBundle\Controller;
use KoKoKo\assert\Assert;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Vendor\Project\Path\Authorization\UserNotFoundException;
use Vendor\Project\Path\Authorization\InvalidCredentialsException;
class LoginController extends Controller
{
/**
* @Route("/login", name="login")
* @Method({"POST"})
* @param Request $request
* @return JsonResponse
*/
public function loginAction(Request $request) : JsonResponse
{
try {
$login = $request->request->get('login');
$pass = $request->request->get('pass');
Assert::assert($login, 'login')->string()->notEmpty()->match('/^[a-z\d]{3,32}$/i');
Assert::assert($pass, 'pass')->string()->notEmpty()->lengthBetween(6, 32);
} catch (\Throwable $exception) {
return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
}
try {
$user = $this->get('UserAuthorizator')->authorize($login, $pass);
return new JsonResponse($user->getId());
} catch (UserNotFoundException $exception) {
return new JsonResponse('User not found', JsonResponse::HTTP_BAD_REQUEST);
} catch (InvalidCredentialsException $exception) {
return new JsonResponse('Invalid login or path', JsonResponse::HTTP_BAD_REQUEST);
} catch (\Throwable $exception) {
$this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
return new JsonResponse('Something went wrnog :((', JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
}
}
}