Laravel 5 - ziarno rzemieślnika [ReflectionException] Klasa SongsTableSeeder nie istnieje

275

Po uruchomieniu db php artisan db: seed otrzymuję następujący błąd:

[ReflectionException] Class SongsTableSeeder does not exist

Co się dzieje?

Moja klasa 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');
    }

}

Klasa My 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);

    }

}
Sasha
źródło
107
composer dump-autoload?
Thomas Jensen
Myślałem, że użyj Faker \ Factory jako Faker; wykonuje robotę?
Sasha
Jaka jest ścieżka do pliku zawierającego SongsTableSeederdefinicję klasy?
Wouter J
To jest kiepskie i złe
Luigi Lopez

Odpowiedzi:

748

Musisz umieścić SongsTableSeederw pliku SongsTableSeeder.phpw tym samym katalogu, w którym znajduje się DatabaseSeeder.phpplik.

Musisz uruchomić w konsoli:

composer dump-autoload

aby wygenerować nową mapę klas, a następnie uruchomić:

php artisan db:seed

Właśnie to przetestowałem. Działa bez problemu w Laravel 5

Marcin Nabiałek
źródło
1
Nie używałam tego modelu w mojej klasie siewników. Teraz działa dobrze.
Jamie Poole,
1
composer dumpautoloadlata także
Connor Leech
kompozytor dump-autoload rozwiązał problem. co naprawdę robi kompozytor dump-autoload?
Luís Almeida,
5
@ LuísAlmeida ponownie generuje dump-autoloadlistę wszystkich klas, które muszą zostać uwzględnione w projekcie, jest używana, gdy masz nową klasę w swoim projekcie. Normalnie działający make:*doda nowo utworzoną klasę, ale nie stanie się to, jeśli ręcznie utworzysz siewnik. Przynajmniej tak to rozumiem, że działa od 5 minut wyszukiwania. Nie jestem ekspertem.
Xander Luciano
Wypróbowałem to rozwiązanie z Laravel 5.8 na serwerze programistycznym i composer dump-autoloadpracowałem dla siebie.
Mycodingproject,
19

Rozwiązałem to, robiąc to:

  1. Skopiuj zawartość pliku.
  2. Usuń plik.
  3. Uruchom polecenie: php artisan make: seeder.
  4. Skopiuj zawartość pliku z powrotem do tego pliku.

Stało się tak, ponieważ zmieniłem nazwę pliku. Nie wiem, dlaczego to nie zadziałało po zmianie.

Ron van Asseldonk
źródło
2
Prawdopodobnie uruchomienie dump-auto kompozytora było łatwiejsze. Autoloader szuka teraz starszego pliku. Jeśli więc zrzucisz ten plik za pomocą wiersza poleceń, wygeneruje nowy plik autoloadera z nowym plikiem. Więc w przyszłości spróbuj tego =)
Ron van Asseldonk
Aby uzyskać więcej informacji o autoloaderze kompozytora, odwiedź tę stronę: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk
van Asseldok, cóż, composer dump-autoloadnie działa dla mnie. Muszę odtworzyć klasę siewnika, aby działała.
М.Б.
To mi pomogło. „Composer dump-autoload” również dla mnie nie działa, ma coś wspólnego z ustawieniami mojego serwera lub faktem, że jest to wspólny serwer.
Derk Jan Speelman
16

Plik SongsTableSeeder.php powinien znajdować się w katalogu database / seeds lub w jego podkatalogu.

Musisz uruchomić:

composer dump-autoload

i wtedy:

php artisan db:seed

lub:

php artisan db:seed --class=SongsTableSeeder
simhumileco
źródło
1
widzę błąd analizy składni za pomocą polecenia „php artisan db: seed --class = SongsTableSeeder”. dziękuję !!
OmiK
4

SongsTableSeeder.php powinien znajdować się w katalogu database / seeds

Kroki polecenia konsoli:

composer dump-autoload

i wtedy:

php artisan cache:clear

i wtedy:

php artisan optimize

i wtedy:

php artisan db:seed

lub:

php artisan db:seed --class=SongsTableSeeder
Chandrakant Ganji
źródło
Pracował dla mnie! Zwłaszcza php artisan optimizeczęść
Mojżesz Ndeda,
3

Korzystam z najnowszej wersji dewelopera Laravel 5, a jeśli zmieniłeś przestrzeń nazw, musisz wywołać klasę seed w następujący sposób:

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

Oczywiście musisz zastąpić todoparrotwyznaczoną przestrzenią nazw. W przeciwnym razie otrzymuję ten sam błąd wskazany w pierwotnym pytaniu.

Jason
źródło
3

Nie composer dump-autoloadzapomnij, że działa w związku z sekcją autoload / classmap composer.json. Uważaj na to, jeśli musisz zmienić katalog seederów lub użyć wielu katalogów do przechowywania seederów.

"autoload": {
    "classmap": [
      "database/seeds",
      "database/factories"
    ],
},
abenevaut
źródło
0

Jeśli nasz CustomTableSeeder znajduje się w tym samym katalogu co DatabaseSeeder, powinniśmy użyć jak poniżej:

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

w naszym pliku DatabaseSeeder; wtedy zostanie zgłoszony kolejny błąd, który mówi: „Nie znaleziono klasy DB”, wtedy powinniśmy dodać naszą fasadę DB do naszego pliku CustomTableSeeder, jak poniżej:

use Illuminate\Support\Facades\DB;

zadziałało dla mnie!

ivahidmontazer
źródło
0

Użyłem tylko POJEDYNCZEGO PLIKU z DWOMA klasami:

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)]);

    }

}

}
Vinod Joshi
źródło
0

Jeśli skopiowałeś pliki inicjujące z innego projektu, musisz uruchomić polecenie rzemieślnika, w php artisan db:seedprzeciwnym razie będzie to w porządku.

Shahid Hussain
źródło
0

[ReflectionException] Class Seeder does not existteż mam i kiedy używam composer dump-autoload, mam błąd, preg_match(): JIT compilation failed: no more memorykiedy go uruchamiam.

Co zrobiłem jest to, że zmieniają ;pcre.jit=1się pcre.jit=Offw php.ini ! Możesz znaleźć ścieżkę, używając php --iniw swoim terminalu!

Używam Mac z php 7.3! Mam nadzieję, że pomoże wam któryś z was!

Gerald Heng
źródło
0

Prawdopodobnie określasz .phprozszerzenie i nie znalazłeś swojej klasy.

Co ja robiłem :

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

Co rozwiązało mój problem: Co robiłem:

php artisan db:seed --class=RolesPermissionsTableSeeder
Axel Paris
źródło
-5

Miałem ten sam błąd „wyjątku odbicia”. Rozwiązaniem było dla mnie skopiowanie pliku klasy na serwer z dev. głupi błąd, ale biorąc pod uwagę liczbę plików, z którymi mamy do czynienia, łatwo zapomnieć o ich skopiowaniu na serwer za każdym razem.

JamesAD-0
źródło
2
Ta odpowiedź jest bardzo niejasna i jest powiązana z konkretną konfiguracją hostingu. Chociaż Twój wkład jest cenny, może to nie pomóc programistom szukającym rozwiązań tego problemu. Myślę, że przyczyną problemu jest pozostawienie ludziom kopiowania plików na serwer. Zachęcamy do posiadania potoku CI, w którym pliki są automatycznie wdrażane na serwerze :)
charj