php – Slim框架无法使用受保护的变量编码为json

基本上我用json编写了一个响应,并且无法弄清楚为什么它一直返回正确数量的数组成员但它们是空的.

 $app->get('/api/server_list', function ($request, $response, $args) {
 $serverlist = new ServerListing($this->db);
 $servers = $serverlist->getServers();
 $newResponse = $response->withJson($servers);
 return $newResponse;    
 });

这是上面的输出,添加了print_r($servers)

[{},{}]Array
(
    [0] => ServerEntity Object
        (
            [id:protected] => 1
            [serverName:protected] => dc1.domain.com
        )

    [1] => ServerEntity Object
        (
            [id:protected] => 2
            [serverName:protected] => dc2.domain.com
        )

)

以下是ServerListing的类代码

 <?PHP

class ServerListing extends Listing
{
    public function getServers() {
        $sql = "SELECT * from servers";
        $stmt = $this->db->query($sql);

        $results = [];

        while($row = $stmt->fetch()) {
            $results[] = new ServerEntity($row);
        }
        return $results;
    }
}

这是ServerEntity:

 <?PHP

 class ServerEntity
 {
     public $id;
     public $serverName;

     public function __construct(array $data) {

         if(isset($data['id'])) {
             $this->id = $data['id'];
          }

         $this->serverName = $data['name'];
     }

         public function getId() {
             return $this->id;
     }
         public function getServerName() {
             return $this->serverName;
     }

 }

唯一的方式是与公众合作.

我理解公共/私人/受保护.虽然这是我第一次使用框架和面向对象的PHP.

在另一个路由中使用相同的数据库调用,然后我可以将服务器列表传递给视图,它工作正常.

所以我猜两个问题.

>为什么json编码失败?
>我做了一些根本错误的事情/是否有更好的方法来做到这一点?

解决方法:

Slim的Response::withJson()没有做任何魔术.它依赖于PHP函数json_encode()来进行编码. json_encode()也不知道任何特殊技巧.如果您将一个对象传递给它进行编码,它将获得它可以从中获取的所有数据.这仅仅意味着它的公共属性,因为这就是OOP的工作原理.

但是,如果在类中实现JsonSerializable接口,那么在编码该类的对象时,您可以控制json_encode()可用的数据.

例如:

class ServerEntity implements JsonSerializable
{
    private $id;
    private $serverName;

    // ... your existing code here

    public function jsonSerialize()
    {
        return array(
            'id'   => $this->id,
            'name' => $this->serverName,
        );
    }
}

一些测试代码

echo(json_encode(new ServerEntity(array('id' => 7, 'name' => 'foo'))));

输出是:

{"id":7,"name":"foo"}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...