基本上我用json编写了一个响应,并且无法弄清楚为什么它一直返回正确数量的数组成员但它们是空的.
$app->get('/api/server_list', function ($request, $response, $args) {
$serverlist = new ServerListing($this->db);
$servers = $serverlist->getServers();
$newResponse = $response->withJson($servers);
return $newResponse;
});
Run Code Online (Sandbox Code Playgroud)
这是上面的输出,添加了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
)
)
Run Code Online (Sandbox Code Playgroud)
以下是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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是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;
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的方式是与公众合作.
我理解公共/私人/受保护.虽然这是我第一次使用框架和面向对象的php.
在另一个路由中使用相同的数据库调用,然后我可以将服务器列表传递给视图,它工作正常.
所以我猜两个问题.
Slim's 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,
);
}
}
Run Code Online (Sandbox Code Playgroud)
一些测试代码:
echo(json_encode(new ServerEntity(array('id' => 7, 'name' => 'foo'))));
Run Code Online (Sandbox Code Playgroud)
输出是:
{"id":7,"name":"foo"}
Run Code Online (Sandbox Code Playgroud)