如何解决将端点反映为Symfonys序列化器的模型,还考虑了共享响应属性
我想要的:
我尝试反序列化使用PHP中的API调用的响应。对于我的端点,我喜欢有一个Model,那样Serializer可以做到这神奇。
响应:
{
"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 ▶}
...
]
}
我被困在哪里:
我创建了BaseModel.php
:https://hastebin.com/exagaworez.xml
我有EndpointModel.php
:https://hastebin.com/tijinojixo.xml
所以我这样称呼:
$this->serializer->deserialize($data,BaseModel::class,'json')
这很好用,但仅适用于一个端点。我想要的是每个端点都有一个模型,并用序列化器以某种方式调用它,以便它转换我的响应。
我如何实现这样的目标?
由于我还需要在BaseModel中描述端点,因此将我限制为一个端点。我可以一遍又一遍地复制代码以实现我的目标,但这似乎很糟糕。
我使用Symfony,使用带有http_client的API,并希望使用序列化程序转换响应。也许有人可以指引我正确的方向,或者给我一些东西来阅读:)
提前谢谢!让我知道您是否需要更多信息
解决方法
我最终得到以下结构,该结构提供了我想要的输出:
由于我在大多数端点上的响应具有相同的属性,因此我创建了一个名为abstract class
的{{1}}:
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;
}
}
,该class
我的extends
并负责特定属性,或者主要是我的BaseResponse
,如下所示:
results
最后,我可以创建保存端点对象结构的模型。这样,我无需跟踪响应部分就可以跟踪实体。看到这里:
<?php
namespace App\Api\Response;
use App\Api\Model\CenterModel;
class CenterResponse extends BaseResponse
{
/**
* @var CenterModel
*/
private $results;
public function __construct(CenterModel ...$results)
{
$this->results = $results;
}
/**
* @return array
*/
public function getResults(): array
{
return $this->results;
}
/**
* @param $results
*/
public function setResults(CenterModel ...$results): void
{
$this->results = $results;
}
}
这样,我可以跟踪自己的响应和端点模型,而不必重复太多的代码行。
稍后,我使用序列化器并调用<?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;
}
}
以反序列化响应。像这样:
CenterResponse
输出将是这样的:
$this->serializer->deserialize($data,CenterResponse::class,'json');
也许这对你们中的一些人来说是一个很好的起点:)现在,我使用它,但也许还有另一种方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。