禁用ApiPlatform中输入对象的自动验证



我已经使用Symfony messenger为CQRS配置了ApiPlatform,如下所述:https://api-platform.com/docs/core/messenger/#using-带有输入对象的信使。我的实体看起来类似于:

#[
ORMEntity(),
ORMTable(name: '`presents`'),
ApiResource(
collectionOperations: [
'get',
'post' => [
'messenger' => 'input',
'input' => AddPresentRequest::class,
],
],
itemOperations: ['get'],
),
]
class Present
{
// ...

然后,我向DTO对象添加了一些符号约束:

use SymfonyComponentValidatorConstraints as Assert;
final class AddPresentRequest
{
#[AssertNotBlank]
#[AssertLength(
max: 180
)]
private string $name;
// ...

现在,ApiPlatform在将请求实体传递到消息总线之前会自动验证请求实体。

我希望它而不是那样做。

原因是,虽然验证对API请求非常有效,但它仅对API请求有效。我希望在执行此操作时也运行验证:

/** @var MessageBusInterface $messageBus */
$messageBus->dispatch(new AddPresentRequest($name));  // api-platform doesn't trigger validation

向消息总线添加验证很容易,我所需要的只是启用ValidationMiddleware,如本symfony文档中所述。这样,信使总是触发验证。

然而,这意味着对于API请求,验证程序运行两次,由ApiPlatform触发,然后再次由ValidationMiddleware触发。这就是为什么我需要告诉ApiPlatform冷静下来,我得到了这个。

我在ApiPlatform文档中找不到任何关于如何禁用自动验证的内容。文档中提到我可以用自定义的东西替换验证器,我认为这可能会提供线索,但不幸的是,没有关于如何替换它的实际信息

我发现的一个解决方法是,我可以在实体上设置一个伪验证组:validationGroups: ['non-existent']。不过,这是不完美的,因为在不检查约束的情况下,验证器仍然会运行并解析实体两次。

如何禁用ApiPlatform的自动验证,以便在其他地方处理验证?

您可以在操作配置中禁用内置的验证事件侦听器:

#[
ApiResource(
collectionOperations: [
'post' => [
'messenger' => 'input',
'input' => AddPresentRequest::class,
'validate' => false, //disables the validation event listener
],
],
),
]

这将阻止API平台(自动(验证您的输入DTO。

最新更新