如何使用 Symfony 5 中的 ParamConverter 将请求中的数组分配给 class 属性
How to assign an array from request to a class property with ParamConverter in Symfony 5
我使用 Symfony 5,当我尝试将请求映射到我的 DTO class 时,ParamConverter 包出现问题。
在我的控制器中,我使用创建方法:
/**
* @Rest\Post("/project/{projectId}/blogger-mix/")
* @ParamConverter("command", class=CreateBloggerMixCommand::class, converter="fos_rest.request_body")
*/
public function create(string $projectId, CreateBloggerMixCommand $command, CreateBloggerMixHandler $handler): View
{
$command->projectId = $projectId;
try {
$bloggerSetItem = $handler->handle($command);
return new View(['id' => $bloggerSetItem->getId()], Response::HTTP_OK);
} catch (\Throwable $exception){
return $this->handleErrors($exception);
}
}
DTO 看起来像:
class CreateBloggerMixCommand implements CommandInterface
{
/**
* @var array|string[]
*/
public array $bloggerSetItems;
}
当我用数组发送请求时:
{
"bloggerSetItems": [
"f04a76e0-d70e-41df-a926-e180c78b34fc",
"07f6d304-9c97-41e9-8f2d-4a993019280c"
]
}
我收到一个错误:
{
"success": false,
"status": 500,
"errors": "You must define a type for App\Project\Api\Command\CreateBloggerMix\CreateBloggerMixCommand::$bloggerSetItems."
}
简而言之,我不明白为什么 ParamConverter 无法解析 属性 数组。如果我将 array
更改为 string
,然后 ParamConverter 响应无法将数组转换为 string
这意味着 ParamConverter 最终可以看到 属性,但不能准确解析数组...
欢迎任何想法!
我认为“您必须定义一个 type”是指数据库列 type。您应该只需要添加列定义,然后更新数据库。存储数组有3种选择,选择一种:
/**
* @var array|string[]
*
* @Column(type="array") // one of these lines
* @Column(type="simple_array") // one of these lines
* @Column(type="json_array") // one of these lines
*/
public array $bloggerSetItems;
感谢您的合作伙伴,我们找到了以下解决方案:
要添加:
use JMS\Serializer\Annotation as Serializer;
并在注释中:
/**
* @Assert\NotBlank
* @Assert\Type (type="array")
* @Serializer\Type(name="array<string>")
* @var array|string[]
*/
public array $bloggerSetItems;
我使用 Symfony 5,当我尝试将请求映射到我的 DTO class 时,ParamConverter 包出现问题。 在我的控制器中,我使用创建方法:
/**
* @Rest\Post("/project/{projectId}/blogger-mix/")
* @ParamConverter("command", class=CreateBloggerMixCommand::class, converter="fos_rest.request_body")
*/
public function create(string $projectId, CreateBloggerMixCommand $command, CreateBloggerMixHandler $handler): View
{
$command->projectId = $projectId;
try {
$bloggerSetItem = $handler->handle($command);
return new View(['id' => $bloggerSetItem->getId()], Response::HTTP_OK);
} catch (\Throwable $exception){
return $this->handleErrors($exception);
}
}
DTO 看起来像:
class CreateBloggerMixCommand implements CommandInterface
{
/**
* @var array|string[]
*/
public array $bloggerSetItems;
}
当我用数组发送请求时:
{
"bloggerSetItems": [
"f04a76e0-d70e-41df-a926-e180c78b34fc",
"07f6d304-9c97-41e9-8f2d-4a993019280c"
]
}
我收到一个错误:
{
"success": false,
"status": 500,
"errors": "You must define a type for App\Project\Api\Command\CreateBloggerMix\CreateBloggerMixCommand::$bloggerSetItems."
}
简而言之,我不明白为什么 ParamConverter 无法解析 属性 数组。如果我将 array
更改为 string
,然后 ParamConverter 响应无法将数组转换为 string
这意味着 ParamConverter 最终可以看到 属性,但不能准确解析数组...
欢迎任何想法!
我认为“您必须定义一个 type”是指数据库列 type。您应该只需要添加列定义,然后更新数据库。存储数组有3种选择,选择一种:
/**
* @var array|string[]
*
* @Column(type="array") // one of these lines
* @Column(type="simple_array") // one of these lines
* @Column(type="json_array") // one of these lines
*/
public array $bloggerSetItems;
感谢您的合作伙伴,我们找到了以下解决方案:
要添加:
use JMS\Serializer\Annotation as Serializer;
并在注释中:
/**
* @Assert\NotBlank
* @Assert\Type (type="array")
* @Serializer\Type(name="array<string>")
* @var array|string[]
*/
public array $bloggerSetItems;