如何使用 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;

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#doctrine-mapping-types

感谢您的合作伙伴,我们找到了以下解决方案:

要添加:

use JMS\Serializer\Annotation as Serializer;

并在注释中:

    /**
     * @Assert\NotBlank
     * @Assert\Type (type="array")
     * @Serializer\Type(name="array<string>")
     * @var array|string[]
     */
    public array $bloggerSetItems;