From f70f602f093cf13f82d326ca182af1f88c4705d4 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 18 May 2015 13:51:30 +0930 Subject: [PATCH] Add some extra optional functionality to the Extend\Permission API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Automatically serialise the attribute - Apply Permissible grant callbacks Need to consider splitting the $permission property into two arguments (currently have to explode by ‘.’) --- framework/core/src/Extend/Permission.php | 37 +++++++++++++++++++ .../core/src/Extend/SerializeAttributes.php | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/framework/core/src/Extend/Permission.php b/framework/core/src/Extend/Permission.php index d6a82efb7..0a8e99529 100644 --- a/framework/core/src/Extend/Permission.php +++ b/framework/core/src/Extend/Permission.php @@ -2,18 +2,55 @@ use Illuminate\Foundation\Application; use Flarum\Core\Models\Permission as PermissionModel; +use Flarum\Extend\SerializeAttributes; class Permission implements ExtenderInterface { protected $permission; + protected $serialize = false; + + protected $grant = []; + public function __construct($permission) { $this->permission = $permission; } + public function serialize($serialize = true) + { + $this->serialize = $serialize; + + return $this; + } + + public function grant($callback) + { + $this->grant[] = $callback; + + return $this; + } + public function extend(Application $app) { PermissionModel::addPermission($this->permission); + + list($entity, $permission) = explode('.', $this->permission); + + if ($this->serialize) { + $extender = new SerializeAttributes( + 'Flarum\Api\Serializers\\'.ucfirst($entity).'Serializer', + function (&$attributes, $model, $serializer) use ($permission) { + $attributes['can'.ucfirst($permission)] = (bool) $model->can($serializer->actor->getUser(), $permission); + } + ); + + $extender->extend($app); + } + + foreach ($this->grant as $callback) { + $model = 'Flarum\Core\Models\\'.ucfirst($entity); + $model::grantPermission($permission, $callback); + } } } diff --git a/framework/core/src/Extend/SerializeAttributes.php b/framework/core/src/Extend/SerializeAttributes.php index 7e118f6f9..d359ef1c6 100644 --- a/framework/core/src/Extend/SerializeAttributes.php +++ b/framework/core/src/Extend/SerializeAttributes.php @@ -19,7 +19,7 @@ class SerializeAttributes implements ExtenderInterface { $app['events']->listen('Flarum\Api\Events\SerializeAttributes', function ($event) { if ($event->serializer instanceof $this->serializer) { - call_user_func($this->callback, $event->attributes, $event->model, $event->serializer); + call_user_func_array($this->callback, [&$event->attributes, $event->model, $event->serializer]); } }); }