我正在构建一个REST API endpint,它将公司添加到MySQL数据库中。客户端发送带有附加数据包的POST请求。数据包是JSON对象。假设JSON公司对象的格式与API使用的公司类完全匹配。
如何将JSON公司对象数据导入公司类?实例化公司对象,json_decode()
JSON对象,然后调用几十个set()
方法似乎很愚蠢。
这似乎特别愚蠢,因为我计划在我的客户端软件包中提供相同的模型来构建在解码之前作为JSON传递给我的API的对象,并再次映射回相同的对象。
我错过了什么吗?在构建我的API时,我经常遇到似乎多余的事情,但也许这就是必须发生的事情。
答案 0 :(得分:13)
为什么不在Company对象的构造函数中处理所有内容,以便传入JSON对象作为参数,构造函数处理所有赋值。这样你甚至不需要公共集合方法。
$companyData = $_POST['company'];
//or $companyData = json_decode($_POST['company']);
//or whatever depending on how you are posting
class Company {
private $companyName;
//etc...
function __construct(array $data) {
foreach($data as $key => $val) {
if(property_exists(__CLASS__,$key)) {
$this->$key = $val;
}
}
}
}
答案 1 :(得分:8)
我们构建了JsonMapper来自动将JSON对象映射到我们自己的模型类上。
它只依赖docblock类型信息进行映射,无论如何都是大多数类属性。
答案 2 :(得分:2)
为什么不在Company对象中创建一个声明对象变量的方法(您不需要为每个变量编写一个set方法,只需要设置所有变量的方法)。 / p>
//Why not write something like this in the class
function setFromJSON($json){
$jsonArray = json_decode($json, true);
foreach($jsonArray as $key=>$value){
$this->$key = $value;
}
}
答案 3 :(得分:2)
不要将您获得的JSON数据与要使用的数据对象完全匹配。数据库和对象会有变化,您不希望这些变化影响您创建的界面,反之亦然。
答案 4 :(得分:1)
这可能会帮助您。
class ObjectMapper
{
protected string $modelClass='';
public function __construct(string $modelClass){
$this->modelClass = $modelClass;
}
protected function mapObject(array $values){
$object = new $this->modelClass();
foreach ($values as $key=>$value){
$mapperFunction = 'set'.$key;
$object->{$mapperFunction}($value);
}
return $object;
}
}