Laravel 5 - вызов неопределенного метода App\Role::firstOrCreate()

Я получаю чрезвычайно странную ошибку в Laravel 5.5, когда пытаюсь запустить семена базы данных. Когда я запускаю php artisan db:seed --class=RoleSeeder, я получаю следующую ошибку:

Вызов неопределенного метода App\Role::firstOrCreate()

Вот мой класс RoleSeeder:

<?php

use Illuminate\Database\Seeder;


class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {


        //Application User: All users have this role be default
        $r = \App\Role::firstOrCreate(['name'=>'app-user'],
            [
                'name'         => 'app-user',
                'display_name' => 'All users of the application',
                'description'  => 'Uses the application',
            ]
        );


    }
}

Я без проблем использовал этот фрагмент кода несколько раз во многих проектах Laravel 5.4. У меня возникла эта ошибка в другом проекте Laravel 5.5, который таинственным образом разрешился сам собой, но теперь я не могу понять, почему это снова происходит в новом проекте.

Когда я запускаю приведенный выше фрагмент кода в laravel tinker (интерактивный php-сеанс), он работает безупречно, как и ожидалось.

Я проверил, что функция firstOrCreate существует в vendor/laravel/src/Illuminate/Database/Eloquent/Builder.php.

Мой класс Role напрямую скопирован из документации библиотеки Entrust:

<?php namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{
}

Когда я изменяю класс Role для прямого расширения Model, команда db:seed работает нормально. Однако ошибка возникает, когда Role расширяет EntrustRole, который определяется следующим образом:

class EntrustRole extends Model implements EntrustRoleInterface
{
//..

Сейчас я реализую обходной путь, но если кто-нибудь может пролить свет на то, почему это нормально работает в php artisan tinker, но не при работе в качестве сеялки, это было бы здорово.

Редактировать: при дальнейшем расследовании выяснилось, что это происходит очень спорадически:

user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan db:seed
Seeding: RoleSeeder


  [BadMethodCallException]
  Call to undefined method App\Role::firstOrCreate()


user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan db:seed
Seeding: RoleSeeder
Seeding: UserSeeder

person Brad    schedule 01.11.2017    source источник


Ответы (1)


После переключения драйвера кеша на Redis проблема теперь решена. Теперь я понимаю, что это, вероятно, «таинственно» исправило и мой другой проект Laravel 5.5 (когда я переключил драйвер кеша на memcached). Похоже на ошибку с Laravel 5.5 и драйвером файлового кеша.

person Brad    schedule 01.11.2017