Php 将端点反映为Symfonys序列化程序的模型,同时考虑共享响应属性
我想要什么:Php 将端点反映为Symfonys序列化程序的模型,同时考虑共享响应属性,php,class,symfony,serialization,interface,Php,Class,Symfony,Serialization,Interface,我想要什么: { "count": 123, "next": "string", "previous": "string", "limit": 123, "offset": 123, "results": [ {...}, {...}
{
"count": 123,
"next": "string",
"previous": "string",
"limit": 123,
"offset": 123,
"results":
[
{...},
{...}
]
}
我试图通过使用PHP中的API调用来反序列化响应。对于我的端点,我希望有一个模型,这样序列化程序就可以发挥神奇的作用
响应:
{
"count": 123,
"next": "string",
"previous": "string",
"limit": 123,
"offset": 123,
"results":
[
{...},
{...}
]
}
现在,每个响应都具有相同的“基本”属性:计数、限制、偏移。。。然后在结果中,每个结果都是特定于端点的
例如:
{
"id": 0,
"name": "string",
"handle": "string"
}
在Symfony中,我称之为:
$this->serializer->deserialize($data, EndpointModel::class, 'json')
这应该给我:
App\Api\Model\BaseModel {#541 ▼
-count: 901
-limit: 10
-offset: 0
-results: array:10 [▼
0 => App\Api\Model\EndpointModel {#547 ▼
-id: 3203
-name: FooBar
}
1 => App\Api\Model\ResultModel {#549 ▶}
...
]
}
我被困的地方:
{
"count": 123,
"next": "string",
"previous": "string",
"limit": 123,
"offset": 123,
"results":
[
{...},
{...}
]
}
我创建了BaseModel.php
:我有
EndpointModel.php
:所以我称之为:
$this->serializer->deserialize($data, BaseModel::class, 'json')
这很好,但只对一个端点有效。我想要的是每个端点都有一个模型,并用序列化程序以某种方式调用它,以便它转换我的响应
我怎样才能做到这样
因为我还需要在BaseModel中描述端点,所以它将我限制为一个端点。我可以一次又一次地复制代码来实现我的目标,但这似乎很糟糕
我使用Symfony,使用http_客户端的API,并希望使用序列化程序转换响应。也许有人能给我指出正确的方向,或者给我读点东西:)
提前谢谢你!如果您需要更多信息,请告诉我我最终得到了以下结构,它为我提供了所需的输出: 由于我对大多数端点的响应具有相同的属性,我创建了一个名为
BaseResponse
的抽象类:
<?php
namespace App\Api\Response;
abstract class BaseResponse
{
/**
* @var int
*/
private $count;
/**
* @var int
*/
private $limit;
/**
* @var int
*/
private $offset;
/**
* @return int
*/
public function getCount(): int
{
return $this->count;
}
/**
* @param int $count
*/
public function setCount(int $count): void
{
$this->count = $count;
}
/**
* @return int
*/
public function getLimit(): int
{
return $this->limit;
}
/**
* @param int $limit
*/
public function setLimit(int $limit): void
{
$this->limit = $limit;
}
/**
* @return int
*/
public function getOffset(): int
{
return $this->offset;
}
/**
* @param int $offset
*/
public function setOffset(int $offset): void
{
$this->offset = $offset;
}
}
最后,我可以创建保存端点对象结构的模型。这样我就可以跟踪实体,而无需触摸响应部分。请看这里:
<?php
namespace App\Api\Model;
/**
* Class CenterModel
* @package App\Api\Model
*/
class CenterModel
{
/**
* @var string
*/
private $name;
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
}
然后输出如下所示:
Center.php on line 64:
App\Api\Response\CenterResponse {#541 ▼
-results: array:10 [▼
0 => App\Api\Model\CenterModel {#547 ▼
-name: "Center Name here"
}
1 => App\Api\Model\CenterModel {#549 ▶}
2 => App\Api\Model\CenterModel {#581 ▶}
3 => App\Api\Model\CenterModel {#621 ▶}
4 => App\Api\Model\CenterModel {#623 ▶}
5 => App\Api\Model\CenterModel {#624 ▶}
6 => App\Api\Model\CenterModel {#625 ▶}
7 => App\Api\Model\CenterModel {#626 ▶}
8 => App\Api\Model\CenterModel {#627 ▶}
9 => App\Api\Model\CenterModel {#628 ▶}
]
-count: 901
-limit: 10
-offset: 0
}
也许这对你们中的一些人来说是一个很好的起点:)现在我使用这个,但可能也有一种不同的方法。为了确保我得到了它,您实际上并没有调用“$this->serializer->反序列化($data,EndpointModel::class,'json')”对吗?您调用$this->serializer->deserialize($data,BaseModel::class,'json'),它应该在内部将结果反序列化到EndpointModel?此外,结果可以包含几种类型的对象?是的,正确。通过调用BaseModel并将$results的类型设置为EndpointModel,我让它与Symfony序列化程序一起工作。这样可以正确地反序列化数据。是的,结果可以包含不同端点的几种类型或模型。如果我只调用BaseModel并传递“正确”的模型,或者如果我调用EndpointModel对我来说并不重要,我不确定序列化程序将如何处理它:),但我肯定能找到一些东西