基本上我用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"}