我有一个创建和验证DTO的ArgumentValueResolverInterface
。
我还设置了一个防火墙来保护路由,另外还使用IsGranted
属性进行细粒度访问控制。
问题是值解析器和验证在安全防火墙之前运行,即使请求未经身份验证也会显示验证错误。
我怎样才能改变值解析器在安全性被解析后运行?这可能吗?
class RequestDTOValueResolver implements ArgumentValueResolverInterface
{
/**
* RequestDTOValueResolver constructor.
* @param ValidatorInterface $validator
*/
public function __construct(protected ValidatorInterface $validator)
{}
/**
* @inheritDoc
*/
public function supports(Request $request, ArgumentMetadata $argument): bool
{
return is_subclass_of($argument->getType(), RequestDTOInterface::class);
}
/**
* @inheritDoc
* @throws ValidationException
* @throws Exception
*/
public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
$className = $argument->getType();
/** @var AbstractRequestDTO $dto */
$dto = new $className($request); //$this->parseRequest($request, $argument);
$groups = $dto->getGroups();
$errors = $this->validator->validate($dto, null, !empty($groups) ? $groups : null);
if ($errors->count()) {
throw ValidationException::create($errors, "One or more fields are invalid.");
}
yield $dto;
}
}
1条答案
按热度按时间flvlnr441#
根据这里提供的官方文档(不同的SF版本之间没有太大区别):https://symfony.com/doc/5.2/controller/argument_value_resolver.html
通过设置适当的优先级,您可能会实现您的目标
我还建议检查每个服务的运行顺序。在这里你可以看到SF是如何做的:
https://symfony.com/doc/current/introduction/http_fundamentals.html