播种时为角色分配权限-委托

时间:2018-08-30 11:15:43

标签: php laravel laravel-seeding entrust eloquent--relationship

Laravel 5.6.3 委托:1.9

我正在尝试为此播种机仅播种一排

<?php

use Illuminate\Database\Seeder;
use App\models\Permission;
use App\models\Role;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
       $role =  Role::create([
            'name' => 'super-admin',
            'display_name' => 'Super Admin',
            'description' => 'This will be one permission, that can not be assigned or created.'
        ]);

        $permission = Permission::first()->where('name', 'super-admin')->first();
        $role->attachPermission($permission);
    }
}

模型

<?php

namespace App\models;

use Illuminate\Database\Eloquent\Model;
use Zizaco\Entrust\EntrustRole;

use App\models\Permission;
use App\User;

class Role extends EntrustRole
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

现在,当我尝试播种时,出现此错误。

D:\work\www\myapp>php artisan db:seed --class=PermissionSeeder

D:\work\www\myapp>php artisan db:seed --class=RoleSeeder

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'App\Permission' not found

  at D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php:656
    652|      * @return mixed
    653|      */
    654|     protected function newRelatedInstance($class)
    655|     {
  > 656|         return tap(new $class, function ($instance) {
    657|             if (! $instance->getConnectionName()) {
    658|                 $instance->setConnection($this->connection);
    659|             }
    660|         });

  Exception trace:

  1   Illuminate\Database\Eloquent\Model::newRelatedInstance("App\Permission")
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php:418

  2   Illuminate\Database\Eloquent\Model::belongsToMany("App\Permission", "permission_role", "role_id", "permission_id")
      D:\work\www\myapp\vendor\zizaco\entrust\src\Entrust\Traits\EntrustRoleTrait.php:80

  Please use the argument -v to see more details.


Using -v

D:\work\www\myapp>php artisan db:seed --class=RoleSeeder -v

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'App\Permission' not found

  at D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php:656
    652|      * @return mixed
    653|      */
    654|     protected function newRelatedInstance($class)
    655|     {
  > 656|         return tap(new $class, function ($instance) {
    657|             if (! $instance->getConnectionName()) {
    658|                 $instance->setConnection($this->connection);
    659|             }
    660|         });

  Exception trace:

  1   Illuminate\Database\Eloquent\Model::newRelatedInstance("App\Permission")
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php:418

  2   Illuminate\Database\Eloquent\Model::belongsToMany("App\Permission", "permission_role", "role_id", "permission_id")
      D:\work\www\myapp\vendor\zizaco\entrust\src\Entrust\Traits\EntrustRoleTrait.php:80

  3   Zizaco\Entrust\EntrustRole::perms()
      D:\work\www\myapp\vendor\zizaco\entrust\src\Entrust\Traits\EntrustRoleTrait.php:177

  4   Zizaco\Entrust\EntrustRole::attachPermission()
      D:\work\www\myapp\database\seeds\RoleSeeder.php:23

  5   RoleSeeder::run()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29

  6   call_user_func_array([])
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29

  7   Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:87

  8   Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:31

  9   Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\Container.php:564

  10  Illuminate\Container\Container::call()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Seeder.php:122

  11  Illuminate\Database\Seeder::__invoke()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php:63

  12  Illuminate\Database\Console\Seeds\SeedCommand::Illuminate\Database\Console\Seeds\{closure}()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\GuardsAttributes.php:122

  13  Illuminate\Database\Eloquent\Model::unguarded(Object(Closure))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php:64

  14  Illuminate\Database\Console\Seeds\SeedCommand::handle()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29

  15  call_user_func_array([])
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29

  16  Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:87

  17  Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:31

  18  Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Container\Container.php:564

  19  Illuminate\Container\Container::call()
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Console\Command.php:179

  20  Illuminate\Console\Command::execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      D:\work\www\myapp\vendor\symfony\console\Command\Command.php:251

  21  Symfony\Component\Console\Command\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Console\Command.php:166

  22  Illuminate\Console\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\vendor\symfony\console\Application.php:886

  23  Symfony\Component\Console\Application::doRunCommand(Object(Illuminate\Database\Console\Seeds\SeedCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\vendor\symfony\console\Application.php:262

  24  Symfony\Component\Console\Application::doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\vendor\symfony\console\Application.php:145

  25  Symfony\Component\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Console\Application.php:89

  26  Illuminate\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php:122

  27  Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      D:\work\www\myapp\artisan:37

D:\work\www\myapp>

更新

我在修修补补上尝试过

>>> $permission = App\models\Permission::first();
=> App\models\Permission {#2923
     id: 1,
     name: "super-admin",
     display_name: "Super Admin",
     description: "This will be one permission, that can not be assigned or created.",
     created_at: "2018-08-31 05:01:08",
     updated_at: "2018-08-31 05:01:08",
   }
>>> $role = App\models\Role::first();
=> App\models\Role {#2925
     id: 1,
     name: "super-admin",
     display_name: "Super Admin",
     description: "This will be one permission, that can not be assigned or modified.",
     created_at: "2018-08-31 05:01:10",
     updated_at: "2018-08-31 05:01:10",
   }
>>> $role->attachPermission($permission);
PHP Error:  Class 'App/Permission' not found in D:/work/www/myapp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php on line 656
>>>

正确的做法是什么?

1 个答案:

答案 0 :(得分:0)

https://github.com/Zizaco/entrust回购底部,它说

  

如果您的应用使用自定义名称空间,则需要告知委托   您的许可和角色模型所在的位置,可以通过编辑   config/entrust.php

中的配置文件

因此,您必须将权限模型名称空间更改为App\models\Permission,默认名称空间设置为App\Permission

因此,编辑config/entrust.php文件并更改permission

'permission' => 'App\models\Permission'

'role' => 'App\models\Role'