我在控制器中使用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对象,而是一个普通的数组。