Laravel 5 - ремесленное семя [ReflectionException] Класс SongsTableSeeder не существует

275

Когда я запускаю php artisan db: seed, я получаю следующую ошибку:

[ReflectionException] Class SongsTableSeeder does not exist

Что происходит?

Мой класс DatabaseSeeder:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        $this->call('SongsTableSeeder');
    }

}

Мой класс SongsTableSeeder:

<?php

// Composer: "fzaninotto/faker": "v1.4.0"
use Faker\Factory as Faker;
use Illuminate\Database\Seeder;
use DB;

class SongsTableSeeder extends Seeder {

    public function run()
    {
        $faker = Faker::create();
        $songs = [];
        foreach(range(1, 10) as $index)
        {
            $songs[] = ['title' => $faker->words(rand(1,4))];
        }

        DB::table('songs')->insert($songs);

    }

}
Саша
источник
109
composer dump-autoload?
Томас Дженсен
Я думал использовать Faker \ Factory в качестве Faker; делает работу?
Саша
Какой путь к файлу, содержащему SongsTableSeederопределение класса?
Wouter J
Это свалка и плохо
Луиджи Лопес,

Ответы:

750

Вам нужно положить SongsTableSeederв файл SongsTableSeeder.phpв том же каталоге, где у вас есть DatabaseSeeder.phpфайл.

И вам нужно запустить в своей консоли:

composer dump-autoload

создать новую карту классов и затем запустить:

php artisan db:seed

Я только что проверил это. Работает без проблем в Laravel 5

Марчин Набиалек
источник
1
Я не использовал модель в своем классе сеялки. Работает нормально сейчас.
Джейми Пул
1
composer dumpautoloadтакже летит
Коннор Пиявка
composer dump-autoload решил проблему для меня. что на самом деле делает дамп-автозагрузка композитора?
Луис Алмейда
5
@ LuísAlmeida dump-autoloadрегенерирует список всех классов, которые должны быть включены в проект, он используется, когда у вас есть новый класс внутри вашего проекта. Обычно при работе make:*добавляется только что созданный класс, но этого не произойдет, если вы создадите сеялку вручную. По крайней мере, так я понимаю, это работает с 5 минут поиска. Я не эксперт.
Ксандер Лучиано,
Я попробовал это решение с Laravel 5.8 на сервере разработки и composer dump-autoloadработал на меня.
Mycodingproject
19

Я решил это, сделав это:

  1. Скопируйте содержимое файла.
  2. Удалить файл.
  3. Запустите команду: php artisan make: seeder.
  4. Скопируйте содержимое файла обратно в этот файл.

Это произошло потому, что я внес изменение в имя файла. Я не знаю, почему это не сработало после изменения.

Рон ван Асселдонк
источник
2
Вероятно, запуск composer dump-auto был проще. Автозагрузчик теперь ищет более старый файл. Поэтому, если вы выгрузите этот файл через командную строку, он сгенерирует новый файл автозагрузчика с новым файлом. Так что в будущем попробуйте это =)
Рон ван Асселдонк
Для получения дополнительной информации о автозагрузчике композитора посетите
Рон ван Асселдонк
ван Асселдок, ну composer dump-autoloadне работает у меня. Я должен воссоздать класс сеялки, чтобы он работал.
М.Б.
Это помогло мне. 'composer dump-autoload' также не работает для меня, это связано с настройками моего сервера или с тем, что это общий сервер.
Дерк Ян
16

Файл SongsTableSeeder.php должен находиться в каталоге database / seed или в его подкаталоге.

Вам нужно запустить:

composer dump-autoload

а потом:

php artisan db:seed

или:

php artisan db:seed --class=SongsTableSeeder
simhumileco
источник
1
смог увидеть ошибку разбора с помощью команды php artisan db: seed --class = SongsTableSeeder. Thnks !!
OmiK
4

SongsTableSeeder.php должен находиться в каталоге database / seed

Консольная команда:

composer dump-autoload

а потом:

php artisan cache:clear

а потом:

php artisan optimize

а потом:

php artisan db:seed

или:

php artisan db:seed --class=SongsTableSeeder
Чандракант Ганджи
источник
Работал на меня! Особенно php artisan optimizeчасть
Моисей Ндеда
3

Я использую самую последнюю версию Laravel 5 dev, и если вы изменили пространство имен, вам нужно будет вызвать ваш начальный класс следующим образом:

$this->call('\todoparrot\TodolistTableSeeder');

Очевидно, вам нужно заменить todoparrotна указанное вами пространство имен. В противном случае я получаю ту же ошибку, которая указана в исходном вопросе.

Джейсон
источник
3

Не composer dump-autoloadзабывайте, что работает в связи с разделом autoload / classmap composer.json. Позаботьтесь об этом, если вам нужно изменить каталог сидеров или использовать несколько каталогов для хранения сидов.

"autoload": {
    "classmap": [
      "database/seeds",
      "database/factories"
    ],
},
abenevaut
источник
0

Если наш CustomTableSeeder находится в одном каталоге с DatabaseSeeder, мы должны использовать, как показано ниже:

$this->call('database\seeds\CustomTableSeeder');

в нашем файле DatabaseSeeder; тогда будет сгенерирована другая ошибка: «Класс БД не найден», тогда мы должны добавить наш фасад БД в наш файл CustomTableSeeder, как показано ниже:

use Illuminate\Support\Facades\DB;

это сработало для меня!

ivahidmontazer
источник
0

Я использовал только один файл с двумя классами в нем:

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Lesson;

use Faker\Factory as Faker;

class DatabaseSeeder extends Seeder {

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    //Lesson::truncate();

    Model::unguard();

    $this->call("LessonsTableSeeder");


}

}

class LessonsTableSeeder extends Seeder {

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

    $faker = Faker::create();

    foreach(range(1,30) as $index) {

        Lesson::create(['title' => $faker->sentence(5), 'body' => $faker->paragraph(4)]);

    }

}

}
Винод Джоши
источник
0

Если вы скопировали файлы сеялок из любого другого проекта, вам нужно запустить команду artisan, php artisan db:seedиначе все в порядке.

Шахид Хуссейн
источник
0

У меня [ReflectionException] Class Seeder does not existтоже есть, и когда я использую composer dump-autoload, я получаю ошибку, preg_match(): JIT compilation failed: no more memoryкогда я запускаю его.

Что я сделал, что я изменить , ;pcre.jit=1чтобы pcre.jit=Offв php.ini ! Вы можете найти путь с помощьюphp --ini в своем терминале!

Я использую Mac с PHP 7.3! Надеюсь, это поможет любому из вас, ребята!

Джеральд Хенг
источник
0

Вы, вероятно, указываете .php расширение, и оно не нашло ваш класс.

Что я делал:

php artisan db:seed --class=RolesPermissionsTableSeeder.php

Что решило мою проблему: что я делал:

php artisan db:seed --class=RolesPermissionsTableSeeder
Аксель Париж
источник
-5

У меня была та же самая ошибка "исключения отражения". Решением было скопировать файл класса на сервер для меня из dev. глупая ошибка, но учитывая, сколько файлов мы имеем дело, легко забыть каждый раз копировать их на сервер.

JamesAD-0
источник
2
Этот ответ очень расплывчатый и связан с вашей конкретной настройкой хостинга. Хотя ваш вклад ценится, это может не помочь разработчикам в поиске решений этой проблемы. Я думаю, что ваша проблема вызвана тем, что вы позволяете людям копировать файлы на сервер. Рекомендуется иметь конвейер CI, где файлы автоматически разворачиваются на сервер :)
charj