正在为数据库设定种子-[ErrorException]正在尝试获取非对象的属性


Seeding database - [ErrorException] Trying to get property of non-object

我正在使用"zizaco/contrust":"~4.0@dev"answers"zizaco/truste":"1.2.*@dev".

我已经按照两个教程中的描述设置了所有内容(信任迁移)。此外,我创建了以下模型:

用户:

    <?php
    use Zizaco'Confide'ConfideUser;
    use Zizaco'Confide'Confide;
    use Zizaco'Confide'ConfideEloquentRepository;
    use Zizaco'Entrust'HasRole;
    use Carbon'Carbon;
    use Illuminate'Auth'UserInterface;
    use Illuminate'Auth'Reminders'RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface{
    use ConfideUser;
    use HasRole;
        /**
         * Get user by username
         * @param $username
         * @return mixed
         */
        public function getUserByUsername( $username )
        {
            return $this->where('username', '=', $username)->first();
        }
        public function joined()
        {
            return String::date(Carbon::createFromFormat('Y-n-j G:i:s', $this->created_at));
        }
        public function saveRoles($inputRoles)
        {
            if(! empty($inputRoles)) {
                $this->roles()->sync($inputRoles);
            } else {
                $this->roles()->detach();
            }
        }
        public function currentRoleIds()
        {
            $roles = $this->roles;
            $roleIds = false;
            if( !empty( $roles ) ) {
                $roleIds = array();
                foreach( $roles as &$role )
                {
                    $roleIds[] = $role->id;
                }
            }
            return $roleIds;
        }
        public static function checkAuthAndRedirect($redirect, $ifValid=false)
        {
            // Get the user information
            $user = Auth::user();
            $redirectTo = false;
            if(empty($user->id) && ! $ifValid) // Not logged in redirect, set session.
            {
                Session::put('loginRedirect', $redirect);
                $redirectTo = Redirect::to('user/login')
                    ->with( 'notice', Lang::get('user/user.login_first') );
            }
            elseif(!empty($user->id) && $ifValid) // Valid user, we want to redirect.
            {
                $redirectTo = Redirect::to($redirect);
            }
            return array($user, $redirectTo);
        }
        public function currentUser()
        {
            return (new Confide(new ConfideEloquentRepository()))->user();
        }
        public function getReminderEmail()
        {
            return $this->email;
        }
    }

角色:

<?php
use Zizaco'Entrust'EntrustRole;
class Role extends EntrustRole {
    public function validateRoles( array $roles )
    {
        $user = Confide::user();
        $roleValidation = new stdClass();
        foreach( $roles as $role )
        {
            // Make sure theres a valid user, then check role.
            $roleValidation->$role = ( empty($user) ? false : $user->hasRole($role) );
        }
        return $roleValidation;
    }
}

权限:

<?php
use Zizaco'Entrust'EntrustPermission;
class Permission extends EntrustPermission
{
    public function preparePermissionsForDisplay($permissions)
    {
        // Get all the available permissions
        $availablePermissions = $this->all()->toArray();
        foreach($permissions as &$permission) {
            array_walk($availablePermissions, function(&$value) use(&$permission){
                if($permission->name == $value['name']) {
                    $value['checked'] = true;
                }
            });
        }
        return $availablePermissions;
    }
    /**
     * Convert from input array to savable array.
     * @param $permissions
     * @return array
     */
    public function preparePermissionsForSave( $permissions )
    {
        $availablePermissions = $this->all()->toArray();
        $preparedPermissions = array();
        foreach( $permissions as $permission => $value )
        {
            // If checkbox is selected
            if( $value == '1' )
            {
                // If permission exists
                array_walk($availablePermissions, function(&$value) use($permission, &$preparedPermissions){
                    if($permission == (int)$value['id']) {
                        $preparedPermissions[] = $permission;
                    }
                });
            }
        }
        return $preparedPermissions;
    }
}

此外,我想从一开始就用值为数据库种子,因此我为用户、角色和权限创建了几个种子。然而,我在我的权限种子程序中遇到了一个错误:

UserTableSeeder:

<?php
class UsersTableSeeder extends Seeder {
    public function run()
    {
        DB::table('users')->delete();

        $users = array(
            array(
                'username'   => 'admin',
                'email'      => 'admin@example.org',
                'password'   => Hash::make('admin'),
                'confirmed'  => 1,
                'confirmation_code' => md5(microtime().Config::get('app.key')),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'username'   => 'moderator',
                'email'      => 'moderator@example.org',
                'password'   => Hash::make('moderator'),
                'confirmed'  => 1,
                'confirmation_code' => md5(microtime().Config::get('app.key')),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'username'   => 'user',
                'email'      => 'user@example.org',
                'password'   => Hash::make('user'),
                'confirmed'  => 1,
                'confirmation_code' => md5(microtime().Config::get('app.key')),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            )
        );
        DB::table('users')->insert( $users );
    }
}

角色TableSeeder:

<?php
class RolesTableSeeder extends Seeder {
    public function run()
    {
        DB::table('roles')->delete();
        $adminRole = new Role;
        $adminRole->name = 'adminRole';
        $adminRole->save();
        $standRole = new Role;
        $standRole->name = 'userRole';
        $standRole->save();
        $modRole = new Role;
        $modRole->name = 'modRole';
        $modRole->save();
        $user = User::where('username','=','admin')->first();
        $user->attachRole( $adminRole );
        $user = User::where('username','=','user')->first();
        $user->attachRole( $standRole );
        $user = User::where('username','=','moderator')->first();
        $user->attachRole( $modRole );
    }
}

PermissionsTableSeeder:

<?php
class PermissionsTableSeeder extends Seeder {
    public function run()
    {
        DB::table('permissions')->delete();
        $permissions = array(
            array( // 1
                'name'         => 'manage_users',
                'display_name' => 'manage users'
            ),
            array( // 2
                'name'         => 'manage_roles',
                'display_name' => 'manage roles'
            ),
            array( // 3
                'name'         => 'standart_user_role',
                'display_name' => 'standart_user_role'
            ),
        );
        DB::table('permissions')->insert( $permissions );
        DB::table('permission_role')->delete();
        $role_id_admin = Role::where('name', '=', 'admin')->first()->id;
        $role_id_mod   = Role::where('name', '=', 'moderator')->first()->id;
        $role_id_stand = Role::where('name', '=', 'user')->first()->id;
        $permission_base = (int)DB::table('permissions')->first()->id - 1;
        $permissions = array(
            array(
                'role_id'       => $role_id_admin,
                'permission_id' => $permission_base + 1
            ),
            array(
                'role_id'       => $role_id_admin,
                'permission_id' => $permission_base + 2
            ),
            array(
                'role_id'       => $role_id_mod,
                'permission_id' => $permission_base + 1
            ),
            array(
                'role_id'       => $role_id_mod,
                'permission_id' => $permission_base + 3
            ),
            array(
                'role_id'       => $role_id_stand,
                'permission_id' => $permission_base + 3
            ),
        );
        DB::table('permission_role')->insert( $permissions );
    }
}

这是我在运行db:seed:时遇到的错误

$ php artisan db:seed
**************************************
*     Application In Production!     *
**************************************
Do you really wish to run this command? Y
Seeded: UsersTableSeeder
Seeded: RolesTableSeeder

  [ErrorException]
  Trying to get property of non-object

db:seed [--class[="..."]] [--database[="..."]] [--force]

有什么建议我在播种时做错了什么吗?

我很感激你的回答!

我认为问题出在:

 $role_id_admin = Role::where('name', '=', 'admin')->first()->id;
 $role_id_mod   = Role::where('name', '=', 'moderator')->first()->id;
 $role_id_stand = Role::where('name', '=', 'user')->first()->id;

您想要获取id,但这样的记录不存在,因此会出现错误。可能没有adminmoderatoruser名称的记录,因为在RolesTableSeeder中,您可以这样创建角色:

$adminRole = new Role;
$adminRole->name = 'adminRole';
$adminRole->save();
$standRole = new Role;
$standRole->name = 'userRole';
$standRole->save();
$modRole = new Role;
$modRole->name = 'modRole';
$modRole->save();

名称为adminRoleuserRolemodRole。因此,要么更改RolesTableSeeder中的名称,要么在PermissionsTableSeeder 中更改名称