Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How do I specify a guard when creating a new permission? #1415

Closed
w-sylph opened this issue Mar 19, 2020 · 4 comments
Closed

How do I specify a guard when creating a new permission? #1415

w-sylph opened this issue Mar 19, 2020 · 4 comments
Labels

Comments

@w-sylph
Copy link

w-sylph commented Mar 19, 2020

Regarding Spatie\Permission\Models\Permissions and Spatie\Permission\Models\Role

Would it be possible to separate config('auth.defaults.guard'); to another method like guard()? So it can be easier to extend

Current implementation

public function __construct(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');

    parent::__construct($attributes);

    $this->setTable(config('permission.table_names.roles'));
}

Proposed Implementation

public function __construct(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? static::guard();

    parent::__construct($attributes);

    $this->setTable(config('permission.table_names.roles'));
}

public static function guard() {
   return config('auth.defaults.guard');
}
@w-sylph w-sylph changed the title Get Guard function for permissions and roles Separate config('auth.defaults.guard') to another method Mar 19, 2020
@drbyte
Copy link
Collaborator

drbyte commented Mar 19, 2020

Can you explain why that would help you? What's the business problem you're trying to solve?

@w-sylph
Copy link
Author

w-sylph commented Mar 19, 2020

Can you explain why that would help you? What's the business problem you're trying to solve?

I'm currently trying to create an Admin Package that uses spatie/laravel-permission which also contains a pre-made admin guard, and it has it own config file. I was trying to replace the guard by I ended up duplicating most of the methods in Spatie\Permission\Models\Permissions and Spatie\Permission\Models\Role just to replace the guard.

I also don't want to replace the config('auth.defaults.guard'); because currently the package I'm creating can be installed in any laravel project

public function __construct(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? static::getGuard();

    parent::__construct($attributes);

    $this->setTable(config('permission.table_names.permissions'));
}

public static function create(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? static::getGuard();

    if (static::getPermissions()->where('name', $attributes['name'])->where('guard_name', $attributes['guard_name'])->first()) {
        throw PermissionAlreadyExists::create($attributes['name'], $attributes['guard_name']);
    }

    return static::query()->create($attributes);
}

/**
 * Find a permission by its name (and optionally guardName).
 *
 * @param string $name
 * @param string|null $guardName
 *
 * @throws \Spatie\Permission\Exceptions\PermissionDoesNotExist
 *
 * @return \Spatie\Permission\Contracts\Permission
 */
public static function findByName(string $name, $guardName = null): PermissionContract
{
    $guardName = $guardName ?? static::getGuard();

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

    if (! $permission) {
        throw PermissionDoesNotExist::create($name, $guardName);
    }

    return $permission;
}

/**
 * Find a permission by its id (and optionally guardName).
 *
 * @param int $id
 * @param string|null $guardName
 *
 * @throws \Spatie\Permission\Exceptions\PermissionDoesNotExist
 *
 * @return \Spatie\Permission\Contracts\Permission
 */
public static function findById(int $id, $guardName = null): PermissionContract
{
    $guardName = $guardName ?? static::getGuard();

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

    if (! $permission) {
        throw PermissionDoesNotExist::withId($id, $guardName);
    }

    return $permission;
}

/**
 * Find or create permission by its name (and optionally guardName).
 *
 * @param string $name
 * @param string|null $guardName
 *
 * @return \Spatie\Permission\Contracts\Permission
 */
public static function findOrCreate(string $name, $guardName = null): PermissionContract
{
    $guardName = $guardName ?? static::getGuard();

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

    if (! $permission) {
        return static::create(['name' => $name, 'guard_name' => $guardName]);
    }

    return $permission;
}

@drbyte
Copy link
Collaborator

drbyte commented Mar 19, 2020

Would the changes we're working on in #1384 solve your problem?

@w-sylph
Copy link
Author

w-sylph commented Mar 19, 2020

Would the changes we're working on in #1384 solve your problem?

I found an alternate solution to set my default guard for the new permissions and role. Thanks.

Permission::create([
  'guard_name' => 'admin'
]);

@w-sylph w-sylph closed this as completed Mar 19, 2020
@drbyte drbyte changed the title Separate config('auth.defaults.guard') to another method How do I specify a guard when creating a new permission? Mar 19, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants