Skip to content

Commit

Permalink
Support getting guard_name from extended model when using static methods
Browse files Browse the repository at this point in the history
  • Loading branch information
mostafamaklad committed Mar 12, 2018
1 parent 32e24da commit 7e73607
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 25 deletions.
65 changes: 65 additions & 0 deletions src/Guard.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php
/**
* Created by PhpStorm.
* User: mostafamaklad
* Date: 12/03/2018
* Time: 2:23 PM
*/

namespace Maklad\Permission;

use Illuminate\Support\Collection;

/**
* Class Guard
* @package Maklad\Permission
*/
class Guard
{
/**
* return collection of (guard_name) property if exist on class or object
* otherwise will return collection of guards names that exists in config/auth.php.
*
* @param $model
*
* @return Collection
* @throws \ReflectionException
*/
public static function getNames($model) : Collection
{
if (\is_object($model)) {
$guardName = $model->guard_name ?? null;
}

if (! isset($guardName)) {
$class = \is_object($model) ? \get_class($model) : $model;
$guardName = (new \ReflectionClass($class))->getDefaultProperties()['guard_name'] ?? null;
}

if ($guardName) {
return collect($guardName);
}
return collect(config('auth.guards'))
->map(function ($guard) {
return config("auth.providers.{$guard['provider']}.model");
})
->filter(function ($model) use ($class) {
return $class === $model;
})
->keys();
}

/**
* Return Default Guard name
*
* @param $class
*
* @return string
* @throws \ReflectionException
*/
public static function getDefaultName($class): string
{
$default = config('auth.defaults.guard');
return static::getNames($class)->first() ?: $default;
}
}
14 changes: 10 additions & 4 deletions src/Models/Permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Maklad\Permission\Contracts\PermissionInterface;
use Maklad\Permission\Exceptions\PermissionAlreadyExists;
use Maklad\Permission\Exceptions\PermissionDoesNotExist;
use Maklad\Permission\Guard;
use Maklad\Permission\Helpers;
use Maklad\Permission\PermissionRegistrar;
use Maklad\Permission\Traits\RefreshesPermissionCache;
Expand All @@ -28,10 +29,12 @@ class Permission extends Model implements PermissionInterface
* Permission constructor.
*
* @param array $attributes
*
* @throws \ReflectionException
*/
public function __construct(array $attributes = [])
{
$attributes['guard_name'] = $attributes['guard_name'] ?? \config('auth.defaults.guard');
$attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);

parent::__construct($attributes);

Expand All @@ -47,11 +50,12 @@ public function __construct(array $attributes = [])
*
* @return $this|\Illuminate\Database\Eloquent\Model
* @throws \Maklad\Permission\Exceptions\PermissionAlreadyExists
* @throws \ReflectionException
*/
public static function create(array $attributes = [])
{
$helpers = new Helpers();
$attributes['guard_name'] = $attributes['guard_name'] ?? \config('auth.defaults.guard');
$attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);

if (static::getPermissions()->where('name', $attributes['name'])->where(
'guard_name',
Expand All @@ -77,10 +81,11 @@ public static function create(array $attributes = [])
*
* @return PermissionInterface
* @throws \Maklad\Permission\Exceptions\PermissionAlreadyExists
* @throws \ReflectionException
*/
public static function findOrCreate(string $name, $guardName = null): PermissionInterface
{
$guardName = $guardName ?? config('auth.defaults.guard');
$guardName = $guardName ?? Guard::getDefaultName(static::class);

$permission = static::getPermissions()
->where('name', $name)
Expand Down Expand Up @@ -123,10 +128,11 @@ public function users(): BelongsToMany
*
* @return PermissionInterface
* @throws PermissionDoesNotExist
* @throws \ReflectionException
*/
public static function findByName(string $name, $guardName = null): PermissionInterface
{
$guardName = $guardName ?? \config('auth.defaults.guard');
$guardName = $guardName ?? Guard::getDefaultName(static::class);

$permission = static::getPermissions()->where('name', $name)->where('guard_name', $guardName)->first();

Expand Down
14 changes: 10 additions & 4 deletions src/Models/Role.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Maklad\Permission\Exceptions\GuardDoesNotMatch;
use Maklad\Permission\Exceptions\RoleAlreadyExists;
use Maklad\Permission\Exceptions\RoleDoesNotExist;
use Maklad\Permission\Guard;
use Maklad\Permission\Helpers;
use Maklad\Permission\Traits\HasPermissions;
use Maklad\Permission\Traits\RefreshesPermissionCache;
Expand All @@ -28,10 +29,12 @@ class Role extends Model implements RoleInterface
* Role constructor.
*
* @param array $attributes
*
* @throws \ReflectionException
*/
public function __construct(array $attributes = [])
{
$attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');
$attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);

parent::__construct($attributes);

Expand All @@ -47,10 +50,11 @@ public function __construct(array $attributes = [])
* @throws RoleAlreadyExists
* @internal param array $attributes§
*
* @throws \ReflectionException
*/
public static function create(array $attributes = [])
{
$attributes['guard_name'] = $attributes['guard_name'] ?? \config('auth.defaults.guard');
$attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);
$helpers = new Helpers();

if (static::where('name', $attributes['name'])->where('guard_name', $attributes['guard_name'])->first()) {
Expand All @@ -74,10 +78,11 @@ public static function create(array $attributes = [])
*
* @return RoleInterface
* @throws \Maklad\Permission\Exceptions\RoleAlreadyExists
* @throws \ReflectionException
*/
public static function findOrCreate(string $name, $guardName = null): RoleInterface
{
$guardName = $guardName ?? config('auth.defaults.guard');
$guardName = $guardName ?? Guard::getDefaultName(static::class);

$role = static::where('name', $name)
->where('guard_name', $guardName)
Expand All @@ -98,10 +103,11 @@ public static function findOrCreate(string $name, $guardName = null): RoleInterf
*
* @return RoleInterface
* @throws RoleDoesNotExist
* @throws \ReflectionException
*/
public static function findByName(string $name, $guardName = null): RoleInterface
{
$guardName = $guardName ?? config('auth.defaults.guard');
$guardName = $guardName ?? Guard::getDefaultName(static::class);

$role = static::where('name', $name)
->where('guard_name', $guardName)
Expand Down
32 changes: 15 additions & 17 deletions src/Traits/HasPermissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Jenssegers\Mongodb\Relations\BelongsToMany;
use Maklad\Permission\Contracts\PermissionInterface as Permission;
use Maklad\Permission\Exceptions\GuardDoesNotMatch;
use Maklad\Permission\Guard;
use Maklad\Permission\Helpers;
use Maklad\Permission\PermissionRegistrar;

Expand Down Expand Up @@ -107,6 +108,7 @@ public function revokePermissionTo(...$permissions)
* @param string|Permission $permission
*
* @return Permission
* @throws \ReflectionException
*/
protected function getStoredPermission($permission): Permission
{
Expand All @@ -121,10 +123,11 @@ protected function getStoredPermission($permission): Permission
* @param Model $roleOrPermission
*
* @throws GuardDoesNotMatch
* @throws \ReflectionException
*/
protected function ensureModelSharesGuard(Model $roleOrPermission)
{
if (! $this->getGuardNames()->contains($roleOrPermission->guard_name)) {
if ( ! $this->getGuardNames()->contains($roleOrPermission->guard_name)) {
$expected = $this->getGuardNames();
$given = $roleOrPermission->guard_name;
$helpers = new Helpers();
Expand All @@ -133,27 +136,22 @@ protected function ensureModelSharesGuard(Model $roleOrPermission)
}
}

/**
* @return Collection
* @throws \ReflectionException
*/
protected function getGuardNames(): Collection
{
if ($this->guard_name) {
return collect($this->guard_name);
}

return collect(config('auth.guards'))
->map(function ($guard) {
return config("auth.providers.{$guard['provider']}.model");
})
->filter(function ($model) {
return \get_class($this) === $model;
})
->keys();
return Guard::getNames($this);
}

/**
* @return string
* @throws \ReflectionException
*/
protected function getDefaultGuardName(): string
{
$default = config('auth.defaults.guard');

return $this->getGuardNames()->first() ?: $default;
return Guard::getDefaultName($this);
}

/**
Expand All @@ -177,7 +175,7 @@ private function convertToPermissionModels($permissions): Collection
$permissions = collect($permissions);
}

if (! $permissions instanceof Collection) {
if ( ! $permissions instanceof Collection) {
$permissions = collect([$permissions]);
}

Expand Down

0 comments on commit 7e73607

Please sign in to comment.