目前,为了将数据从我的网络应用程序发送到前端,我的类实现了JsonSerializable
界面。
但是现在,当用户拥有足够的权限时,我想向前端发送更多信息。这些权限只能通过类Entity\User
的对象来识别,比如说$user->hasPrivileges(…)
。
可悲的是,我无法向jsonSerialize()
方法提供$user
变量。实现这一目标的最简洁方法是什么?
答案 0 :(得分:1)
在序列化之前通知此对象:
if ($user->hasPrivileges()) {
$object->IwillBeSerializngYouForUser($user);
}
$serialized = $object->jsonSerialize();
答案 1 :(得分:1)
我假设你可以在你的前端类中添加一个属性来过滤掉非特权数据,并在调用jsonSerialize之前设置这个属性:
class FrontEnd implements JsonSerializable {
private $serialize_all = false;
private $pub_data = Array(/* whatever */);
private $admin_data = Array (/* whatever */);
public function admin_output ($p) { $this->serialize_all = $p; }
public function jsonSerialize()
{
return $this->serialize_all
? array_merge ($this->pub_data, $this->admin_data)
: $this->pub_data;
}
}
$frontend->admin_output ($user->is_admin ());
$output = json_encode ($frontend);
如果有许多不同的对象要序列化,你可以将它们子类化为一个处理问题的类,如下所示:
abstract class privilegiedSerializable implements jsonSerializable {
abstract function json_encode ($is_admin); // child picks the export data
protected function do_encode ($data) // and we take care of the rest
{
$this->json_data = $data;
$out = json_encode ($this);
$this->json_data = null; // cleanup a bit
return $out;
}
public function jsonSerialize () { return $this->json_data; }
}
class FrontEnd extends privilegiedSerializable {
private $pub_data = Array(/* whatever */);
private $admin_data = Array (/* whatever */);
public function json_encode ($is_admin)
{
return $this->do_encode (
$is_admin
? array_merge ($this->pub_data, $this->admin_data)
: $this->pub_data);
}
}
$output = $frontend->json_encode ($user->is_admin())
或者在脚本执行期间用户权限是常量:
abstract class privilegiedSerializable implements jsonSerializable {
static private $serialize_all = false;
static public function admin_output ($p) { self::$serialize_all = $p; }
abstract function json_encode (); // child picks the export data
// same as before
}
class FrontEnd extends privilegiedSerializable {
// ...
public function json_encode ()
{
return $this->do_encode (
parent::$serialize_all
? array_merge ($this->pub_data, $this->admin_data)
: $this->pub_data);
}
privilegiedSerializable::admin_output ($user->is_admin());
$output1 = $frontend1->json_encode ();
$output2 = $frontend2->json_encode ();