Laravel 5 - seme di classe [ReflectionException] Class SongsTableSeeder non esiste


275

Quando eseguo php artisan db: seed ricevo il seguente errore:

[ReflectionException] Class SongsTableSeeder does not exist

Cosa sta succedendo?

La mia classe 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');
    }

}

My SongsTableSeeder class:

<?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?
Thomas Jensen,

Ho pensato di usare Faker \ Factory come Faker; sta facendo il lavoro?
Sasha,

Qual è il percorso del file contenente la SongsTableSeederdefinizione della classe?
Wouter J


Questa è una discarica e un male
Luigi Lopez,

Risposte:


750

Devi inserire un SongsTableSeederfile SongsTableSeeder.phpnella stessa directory in cui hai il tuo DatabaseSeeder.phpfile.

E devi correre nella tua console:

composer dump-autoload

per generare una nuova mappa di classe e quindi eseguire:

php artisan db:seed

L'ho appena provato. Funziona senza problemi in Laravel 5


1
Non avevo "usato" il modello nella mia classe di seminatrice. Funziona bene ora.
Jamie Poole,

1
composer dumpautoloadvola anche
Connor Leech il

il compositore dump-autoload mi ha risolto il problema. che compositore dump-autoload fa davvero?
Luís Almeida,

5
@ LuísAlmeida dump-autoloadrigenera l'elenco di tutte le classi che devono essere incluse nel progetto, viene utilizzato quando hai una nuova classe all'interno del tuo progetto. Normalmente in esecuzione make:*aggiungerà la classe appena creata, ma ciò non si verificherà se si crea manualmente una seminatrice. Almeno è così che ho capito che funziona da 5 minuti di ricerca. Non sono un esperto.
Xander Luciano

Ho provato questa soluzione con Laravel 5.8 su un server di sviluppo e composer dump-autoloadho lavorato per me.
Progetto Mycoding l'

19

L'ho risolto facendo questo:

  1. Copia il contenuto del file.
  2. Rimuovi il file.
  3. Esegui comando: php artisan make: seeder.
  4. Copia il contenuto del file in questo file.

Questo è successo perché ho apportato una modifica al nome del file. Non so perché non ha funzionato dopo il cambiamento.


2
Probabilmente eseguire il dump-auto del compositore era più semplice. Il caricatore automatico è ora alla ricerca di un file più vecchio. Quindi, se scarichi questo file dalla riga di comando, genererà un nuovo file del caricatore automatico con il nuovo file. Quindi in futuro prova questo =)
Ron van Asseldonk,

Per ulteriori informazioni sul caricatore automatico del compositore consultare questo sito: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk,

van Asseldok, beh, composer dump-autoloadnon funziona per me. Devo ricreare la classe seminatrice per farlo funzionare.
М.Б.

Questo mi ha aiutato. 'compositore dump-autoload' non funziona anche per me, qualcosa a che fare con le impostazioni del mio server o con il fatto che si tratta di un server condiviso.
Derk Jan Speelman,

16

Il file SongsTableSeeder.php dovrebbe trovarsi nella directory database / seed o nella sua sottodirectory.

Devi eseguire:

composer dump-autoload

e poi:

php artisan db:seed

o:

php artisan db:seed --class=SongsTableSeeder

1
in grado di vedere Parse Error con il comando 'php artisan db: seed --class = SongsTableSeeder'. thnks !!
OmiK,

4

SongsTableSeeder.php dovrebbe essere nella directory database / seed

Passaggi di comando della console:

composer dump-autoload

e poi:

php artisan cache:clear

e poi:

php artisan optimize

e poi:

php artisan db:seed

o:

php artisan db:seed --class=SongsTableSeeder

Ha funzionato per me! Soprattutto la php artisan optimizeparte
Moses Ndeda,

3

Sto eseguendo l'ultima versione di sviluppo di Laravel 5 e se hai cambiato lo spazio dei nomi dovrai chiamare la tua classe seed in questo modo:

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

Ovviamente dovrai sostituirlo todoparrotcon il tuo spazio dei nomi designato. Altrimenti ricevo lo stesso errore indicato nella domanda originale.


3

Non dimenticare che composer dump-autoloadfunziona in relazione alla sezione autoload / classmap di composer.json. Prenditi cura di questo se hai bisogno di cambiare la directory dei seeders o usare più directory per archiviare i seeders.

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

0

Se il nostro CustomTableSeeder è nella stessa directory con DatabaseSeeder, dovremmo usare come di seguito:

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

nel nostro File DatabaseSeeder; quindi verrà generato un altro errore che dice: "Classe DB non trovata", quindi dovremmo aggiungere la nostra facciata DB al nostro file CustomTableSeeder come di seguito:

use Illuminate\Support\Facades\DB;

ha funzionato per me!


0

Ho usato solo UN SOLO FILE con DUE classi in seguito:

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

Se hai copiato i file seeders da qualsiasi altro progetto, devi eseguire il comando artisan php artisan db:seedaltrimenti andrà bene.


0

anche io ho [ReflectionException] Class Seeder does not existe quando uso composer dump-autoloadho ricevuto un errorepreg_match(): JIT compilation failed: no more memory quando lo eseguo.

Quello che ho fatto è che ho cambiato ;pcre.jit=1a pcre.jit=Offin php.ini ! Puoi trovare il percorso usando php --ininel tuo terminale!

Sto usando Mac con PHP 7.3! Spero che possa aiutare qualcuno di voi là fuori!


0

Probabilmente si specifica il .php estensione e non ha trovato la tua classe.

Cosa stavo facendo:

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

Cosa ha risolto il mio problema: Cosa stavo facendo:

php artisan db:seed --class=RolesPermissionsTableSeeder

-5

Ho avuto lo stesso errore "eccezione di riflessione". La soluzione è stata quella di copiare il file di classe sul server, da dev, per me. errore stupido, ma dato quanti file abbiamo a che fare con la sua facile dimenticare di copiarli sul server ogni volta.


2
Questa risposta è molto vaga ed è abbinata alla tua specifica configurazione di hosting. Sebbene il tuo contributo sia valutato, ciò potrebbe non aiutare gli sviluppatori a cercare soluzioni a questo problema. Penso che il tuo problema sia causato dal fatto che lasci agli umani la copia dei file sul server. È incoraggiato ad avere una pipeline CI in cui i file vengono automaticamente distribuiti sul server :)
charj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.