使用Symfony @ParamConverter将对象的关联数组作为参数传递

3

我在控制器中使用Symfony的@ParamConverter来传递对象数组。我可以通过以下配置成功地传递对象数组:

* @ParamConverter("arrayOfObjects", class="array<MyService\MyClass>", converter="fos_rest.request_body")

我在控制器中得到的是下面这个:

arrayOfObjects = [
    [0] => {MyService\MyClass}[3],
    [1] => {MyService\MyClass}[3],
    [2] => {MyService\MyClass}[3]
]
...

然而,我创建的POST调用使用以下正文:
{
    "id_1": {
        "name": "name 1",
        "description": "desc 1",
        "number": "number 1",
    },
    "id_2": {
        "name": "name 2",
        "description": "desc 2",
        "number": "number 2",
    },
...
}

现在,我希望@ParamConverter能够将主体转换为类似以下内容的东西:
arrayOfObjects = [
    ["id_1"] => {MyService\MyClass}[3],
    ["id_2"] => {MyService\MyClass}[3],
    ["id_3"] => {MyService\MyClass}[3]
]

你能想到一种方法让这个工作吗?

我的控制器:

    /**
     * @OA\Post(
     *     path="/post-my-class",
     *     @OA\RequestBody(
     *          required=true,
     *          @OA\JsonContent(
     *               ref="#/components/schemas/MyClass"
     *          )
     *     )
     *)
     * @ParamConverter("arrayOfObjects", class="array<MyService\MyClass>", converter="fos_rest.request_body")
     *
     * @Route("/post-my-class", methods="POST")
     * @param MyClass[] $arrayOfObjects
     *
     * @return Response
     */
    public function postController(array $arrayOfObjects): Response
    {
       // Some logic ...
    }

我的课程:

class MyClass
{
    /**
     * @var string
     * @OA\Property(
     *     type = "string",
     *     property="name"
     * )
     * @Serializer\Type(name="string")
     */
    private $name;

    /**
     * @var string
     * @OA\Property(
     *     type = "string",
     *     property="description"
     * )
     * @Serializer\Type(name="string")
     */
    private $description;

    /**
     * @var string
     * @OA\Property(
     *     type = "string",
     *     property="number"
     * )
     * @Serializer\Type(name="string")
     */
    private $number;

    /**
     * MyClass constructor.
     *
     * @param string $name
     * @param string $description
     * @param string $number
     */
    public function __construct(
        string $name,
        string $description,
        string $number
    ) {
        $this->name = $name;
        $this->description = $description;
        $this->number = $number;
    }
...
}

注意: 如果我使用

 * @ParamConverter("arrayOfObjects", class="array", converter="fos_rest.request_body")
 *
 * @Route("/post-my-class", methods="POST")
 * @param array $arrayOfObjects

我得到:

arrayOfObjects = [
    ["id_1"] => {array}[3],
    ["id_2"] => {array}[3],
    ["id_3"] => {array}[3]
]

这个方法接近我的要求,但是输入参数没有被转换成MyClass对象,而是一个普通的数组。


为什么需要键值(keys)?例如“id_1”、“id_2”等? - Petro Popelyshko
这就是请求的方式。我对此没有影响。我需要它们以便根据它们的“id”来区分对象。 - Michalis Fotiadis
1个回答

0
为什么不直接在方法内部获取请求的主体呢?这样更方便。
   /**
     * @Route("/test", name="test")
     */
    public function test(Request $request)
    {
        $contentJson=$request->getContent();
        $data=json_decode($contentJson,true);}

1
这是一个有效的解决方法,但如果可能的话,我更喜欢我所描述的方式。 - Michalis Fotiadis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接