База данных заполнения - [ErrorException] Попытка получить свойство не-объекта

Я использую "zizaco/confide": "~4.0@dev" и "zizaco/entrust": "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'      => '[email protected]',
                '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'      => '[email protected]',
                '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'      => '[email protected]',
                '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 );
    }

}

Таблица ролей:

<?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]

Любые рекомендации, что я делаю неправильно в моем посеве?

Я ценю ваши ответы!


person Carol.Kar    schedule 15.10.2014    source источник
comment
Вы должны включить класс сеялки и семена, которые вы запускаете. Теперь мы не знаем, что будет после RolesTableSeeder   -  person Marcin Nabiałek    schedule 15.10.2014
comment
@MarcinNabiałek Я обновил свой вопрос!   -  person Carol.Kar    schedule 15.10.2014


Ответы (1)


Я думаю, что проблема в:

 $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, но таких записей не существует, поэтому вы получаете ошибку. Вероятно, нет записей с именами admin, moderator или user, потому что, глядя на 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();

с именами adminRole, userRole, modRole. Поэтому либо измените имена внутри RolesTableSeeder, либо измените их в PermissionsTableSeeder.

person Marcin Nabiałek    schedule 15.10.2014