根据用户的权限以不同方式序列化对象

时间:2014-01-01 22:09:32

标签: php serialization

目前,为了将数据从我的网络应用程序发送到前端,我的类实现了JsonSerializable界面。

但是现在,当用户拥有足够的权限时,我想向前端发送更多信息。这些权限只能通过类Entity\User的对象来识别,比如说$user->hasPrivileges(…)

可悲的是,我无法向jsonSerialize()方法提供$user变量。实现这一目标的最简洁方法是什么?

2 个答案:

答案 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 ();