Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将端点反映为Symfonys序列化程序的模型,同时考虑共享响应属性_Php_Class_Symfony_Serialization_Interface - Fatal编程技术网

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对我来说并不重要,我不确定序列化程序将如何处理它:),但我肯定能找到一些东西