0

我需要做的是扩展 Spatie 权限包角色模型的所有功能,但为派生模型使用不同的表。

现在我有一个模型 SubscriptionPackage ,我想模拟角色的行为,以便可以为其分配权限,进而可以将此模型分配给用户。但我也想保持角色模型完整。

我尝试扩展 Yes,但是当我创建一个新的 SubscriptionPackage 时,尽管在派生模型中指定了表,但新记录是在角色表而不是 subscription_packages 表中创建的。如下所示

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Permission; // This extends from Spatie\Permission\Models\Permission
use Spatie\Permission\Models\Role as SpatieRole;



class SubscriptionPackage extends SpatieRole
{
    //
    protected $guarded = ['id'];

    protected $table = 'subscription_packages';


    /**
     * The permissions that belong to the package.
     */
    public function packagePermissions()
    {
        return $this->belongsToMany(Permission::class);
    }

}

使用上面的代码,当我创建一个新的 SubscriptionPackage 时,记录应该被插入到 subscription_packages 表中,但在这种情况下,它会进入角色表。任何有关如何解决此问题的指示都将受到高度赞赏。

4

2 回答 2

1

如果您查看Role源代码,您将在__construct方法中使用:

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')); // <-- HERE IS THE PROBLEM!
    }

因此,如果您希望SubscriptionPackage将其记录写入正确的表中,则必须像这样覆盖此行为:

public function __construct(array $attributes = [])
    {
        parent::__construct($attributes)

        $this->setTable('your_table_name'); // <-- HERE THE SOLUTION!
    }
于 2019-09-26T10:29:48.713 回答
0

我不认为你可以。Spatie 已经有 5 个表,并且仅从这些表中获取数据。但是,如果您想进行更改,您仍然可以使用模型中的表和列名进行更改

于 2019-09-26T10:26:30.110 回答