Laravel 5 - handwerklicher Samen [ReflectionException] Klasse SongsTableSeeder existiert nicht

274

Wenn ich php artisan db: seed starte, wird folgende Fehlermeldung angezeigt:

[ReflectionException] Class SongsTableSeeder does not exist

Was ist los?

Meine DatabaseSeeder-Klasse:

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

}

Meine SongsTableSeeder-Klasse:

<?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
quelle
107
composer dump-autoload?
Thomas Jensen
Ich dachte, benutze Faker \ Factory als Faker; macht den Job?
Sasha
Wie lautet der Pfad zu der Datei mit der SongsTableSeederKlassendefinition?
Wouter J
Das ist Müll und schlecht
Luigi Lopez

Antworten:

746

Sie müssen die SongsTableSeederDatei SongsTableSeeder.phpin demselben Verzeichnis ablegen, in dem Sie Ihre DatabaseSeeder.phpDatei haben.

Und Sie müssen in Ihrer Konsole laufen:

composer dump-autoload

um eine neue Klassenzuordnung zu generieren und dann auszuführen:

php artisan db:seed

Ich habe es gerade getestet. In Laravel 5 funktioniert es problemlos

Marcin Nabiałek
quelle
1
Ich hatte das Modell in meiner Sämaschine nicht "benutzt". Funktioniert jetzt gut.
Jamie Poole
1
composer dumpautoloadfliegt auch
Connor Leech
Composer Dump-Autoload hat das Problem für mich gelöst. Was macht Composer Dump-Autoload wirklich?
Luís Almeida
5
@ LuísAlmeida generiert dump-autoloaddie Liste aller Klassen neu, die in das Projekt aufgenommen werden müssen. Sie wird verwendet, wenn Sie eine neue Klasse in Ihrem Projekt haben. Normalerweise wird beim Ausführen make:*die neu erstellte Klasse hinzugefügt. Dies tritt jedoch nicht auf, wenn Sie manuell einen Seeder erstellen. Zumindest verstehe ich das so, dass es nach 5 Minuten Suche funktioniert. Ich bin kein Experte.
Xander Luciano
Ich habe diese Lösung mit Laravel 5.8 auf einem Entwicklungsserver ausprobiert und composer dump-autoloadfür mich gearbeitet.
Mycodingproject
19

Ich habe es dadurch gelöst:

  1. Kopieren Sie den Dateiinhalt.
  2. Datei löschen.
  3. Führen Sie den Befehl aus: php artisan make: seeder.
  4. Kopieren Sie den Dateiinhalt zurück in diese Datei.

Dies geschah, weil ich den Dateinamen geändert habe. Ich weiß nicht, warum es nach der Änderung nicht funktioniert hat.

Ron van Asseldonk
quelle
2
Wahrscheinlich war es einfacher, Composer Dump-Auto auszuführen. Der Autoloader sucht jetzt nach einer älteren Datei. Wenn Sie diese Datei über die Befehlszeile sichern, wird eine neue Autoloader-Datei mit der neuen Datei generiert. Also versuchen Sie es in Zukunft =)
Ron van Asseldonk
Weitere Informationen zum Composer Autoloader finden Sie auf dieser Website: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk
van Asseldok composer dump-autoloadfunktioniert bei mir nicht. Ich muss die Seeder-Klasse neu erstellen, damit sie funktioniert.
М.Б.
Das hat mir geholfen. 'Composer Dump-Autoload' funktioniert auch bei mir nicht, was mit meinen Servereinstellungen oder der Tatsache zu tun hat, dass es sich um einen gemeinsam genutzten Server handelt.
Derk Jan Speelman
16

Die Datei SongsTableSeeder.php sollte sich im Verzeichnis database / seed oder in seinem Unterverzeichnis befinden.

Sie müssen ausführen:

composer dump-autoload

und dann:

php artisan db:seed

oder:

php artisan db:seed --class=SongsTableSeeder
simhumileco
quelle
1
Lage zu sehen , Parse - Fehler mit ‚php Handwerkers db: Samen --Klasse = SongsTableSeeder‘ Befehl. Danke !!
OmiK
4

SongsTableSeeder.php sollte sich im Verzeichnis database / seed befinden

Konsolenbefehlsschritte:

composer dump-autoload

und dann:

php artisan cache:clear

und dann:

php artisan optimize

und dann:

php artisan db:seed

oder:

php artisan db:seed --class=SongsTableSeeder
Chandrakant Ganji
quelle
Hat für mich gearbeitet! Besonders der php artisan optimizeTeil
Moses Ndeda
3

Ich verwende die neueste Laravel 5-Entwicklerversion. Wenn Sie den Namespace geändert haben, müssen Sie Ihre Seed-Klasse folgendermaßen aufrufen:

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

Natürlich müssen Sie durch todoparrotIhren angegebenen Namespace ersetzen . Ansonsten erhalte ich den gleichen Fehler wie in der ursprünglichen Frage.

Jason
quelle
3

Vergessen Sie nicht, dass die composer dump-autoloadArbeiten in Bezug auf den Autoload / Classmap-Abschnitt von composer.json. Achten Sie darauf, wenn Sie das Seeders-Verzeichnis ändern oder mehrere Verzeichnisse zum Speichern von Seedern verwenden müssen.

"autoload": {
    "classmap": [
      "database/seeds",
      "database/factories"
    ],
},
abenevaut
quelle
0

Wenn sich unser CustomTableSeeder im selben Verzeichnis wie DatabaseSeeder befindet, sollten wir Folgendes verwenden:

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

in unserer DatabaseSeeder-Datei; Dann wird ein weiterer Fehler ausgegeben, der besagt: 'DB-Klasse nicht gefunden'. Dann sollten wir unsere DB-Fassade wie folgt zu unserer CustomTableSeeder-Datei hinzufügen:

use Illuminate\Support\Facades\DB;

es hat bei mir funktioniert!

ivahidmontazer
quelle
0

Ich habe nur SINGLE FILE mit ZWEI Klassen verwendet:

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
quelle
0

Wenn Sie die Seeders-Dateien aus einem anderen Projekt kopiert haben, müssen Sie den Befehl handwerker ausführen, php artisan db:seedda dies sonst in Ordnung ist.

Shahid Hussain
quelle
0

Ich habe [ReflectionException] Class Seeder does not existauch und wenn ich benutze composer dump-autoload, habe ich einen Fehler bekommen, preg_match(): JIT compilation failed: no more memorywenn ich es laufen lasse.

Was ich getan habe ist , dass ich ändern , ;pcre.jit=1um pcre.jit=Offin php.ini ! Sie finden den Pfad php --iniin Ihrem Terminal!

Ich benutze Mac mit PHP 7.3! Hoffe, das hilft einem von euch da draußen!

gerald heng
quelle
0

Sie geben wahrscheinlich die .phpErweiterung an und Ihre Klasse wurde nicht gefunden.

Womit ich beschäftigt war :

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

Was mein Problem gelöst hat: Was ich tat:

php artisan db:seed --class=RolesPermissionsTableSeeder
Axel Paris
quelle
-5

Ich hatte den gleichen Fehler "Reflection Exception". Die Lösung bestand darin, die Klassendatei von dev für mich auf den Server zu kopieren. dummer Fehler, aber angesichts der Anzahl der Dateien, mit denen wir zu tun haben, kann man leicht vergessen, sie jedes Mal auf den Server zu kopieren.

JamesAD-0
quelle
2
Diese Antwort ist sehr vage und hängt mit Ihrem spezifischen Hosting-Setup zusammen. Obwohl Ihre Eingabe geschätzt wird, hilft dies Entwicklern möglicherweise nicht bei der Suche nach Lösungen für dieses Problem. Ich denke, Ihr Problem wird dadurch verursacht, dass Sie es den Menschen überlassen, Dateien auf den Server zu kopieren. Es wird
empfohlen,