Laravel 5 - semences artisanales [ReflectionException] Classe SongsTableSeeder n'existe pas

275

Lorsque j'exécute php artisan db: seed , j'obtiens l'erreur suivante:

[ReflectionException] Class SongsTableSeeder does not exist

Que se passe-t-il?

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

}

Ma classe 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
la source
109
composer dump-autoload?
Thomas Jensen
J'ai pensé utiliser Faker \ Factory comme Faker; fait le travail?
Sasha
Quel est le chemin d'accès au fichier contenant la SongsTableSeederdéfinition de classe?
Wouter J
C'est du dumping et du mauvais
Luigi Lopez

Réponses:

750

Vous devez mettre SongsTableSeederen fichier SongsTableSeeder.phpdans le même répertoire où vous avez votre DatabaseSeeder.phpfichier.

Et vous devez exécuter dans votre console:

composer dump-autoload

pour générer une nouvelle carte de classe, puis exécutez:

php artisan db:seed

Je viens de le tester. Cela fonctionne sans problème dans Laravel 5

Marcin Nabiałek
la source
1
Je n'avais pas «utilisé» le modèle dans ma classe de semoir. Fonctionne bien maintenant.
Jamie Poole
1
composer dumpautoloadvole également
Connor Leech
compositeur dump-autoload a résolu le problème pour moi. quel composeur dump-autoload fait vraiment?
Luís Almeida
5
@ LuísAlmeida dump-autoloadrégénère la liste de toutes les classes qui doivent être incluses dans le projet, elle est utilisée lorsque vous avez une nouvelle classe dans votre projet. Normalement, l'exécution make:*ajoutera la classe nouvellement créée, mais cela ne se produira pas si vous créez manuellement un semoir. Du moins, c'est ainsi que je comprends que cela fonctionne à partir de 5 minutes de recherche. Je ne suis pas un expert.
Xander Luciano
J'ai essayé cette solution avec Laravel 5.8 sur un serveur de développement et composer dump-autoloadj'ai travaillé pour moi.
Mycodingproject
19

Je l'ai résolu en faisant ceci:

  1. Copiez le contenu du fichier.
  2. Effacer le fichier.
  3. Exécuter la commande: php artisan make: seeder.
  4. Copiez le contenu du fichier dans ce fichier.

Cela s'est produit parce que j'ai modifié le nom du fichier. Je ne sais pas pourquoi cela n'a pas fonctionné après le changement.

Ron van Asseldonk
la source
2
Il était probablement plus facile d'exécuter le vidage automatique du compositeur. L'autochargeur recherche maintenant un fichier plus ancien. Donc, si vous videz ce fichier via la ligne de commande, il générera un nouveau fichier de chargeur automatique avec le nouveau fichier. Donc à l'avenir, essayez ceci =)
Ron van Asseldonk
Pour plus d'informations sur le chargeur automatique de compositeurs, consultez ce site: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk
van Asseldok, eh bien, composer dump-autoloadne fonctionne pas pour moi. Je dois recréer la classe de semoir pour le faire fonctionner.
М.Б.
Cela m'a aidé. 'composer dump-autoload' ne fonctionne pas aussi pour moi, quelque chose à voir avec les paramètres de mon serveur ou le fait qu'il s'agit d'un serveur partagé.
Derk Jan Speelman
16

Le fichier SongsTableSeeder.php doit se trouver dans la base de données / graines répertoire ou dans son sous-répertoire.

Vous devez exécuter:

composer dump-autoload

puis:

php artisan db:seed

ou:

php artisan db:seed --class=SongsTableSeeder
simhumileco
la source
1
capable de voir l' erreur d'analyse avec la commande «php artisan db: seed --class = SongsTableSeeder». merci !!
OmiK
4

SongsTableSeeder.php devrait être dans le répertoire database / seeds

Étapes de commande de la console:

composer dump-autoload

puis:

php artisan cache:clear

puis:

php artisan optimize

puis:

php artisan db:seed

ou:

php artisan db:seed --class=SongsTableSeeder
Chandrakant Ganji
la source
A travaillé pour moi! Surtout la php artisan optimizepartie
Moses Ndeda
3

J'utilise la toute dernière version de développement de Laravel 5, et si vous avez changé l'espace de noms, vous devrez appeler votre classe de départ comme ceci:

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

De toute évidence, vous devrez le remplacer todoparrotpar votre espace de noms désigné. Sinon, je reçois la même erreur indiquée dans la question d'origine.

Jason
la source
3

N'oubliez pas que les composer dump-autoloadtravaux en relation avec la section autoload / classmap de composer.json. Faites attention à cela si vous devez modifier le répertoire des seeders ou utiliser plusieurs répertoires pour stocker les seeders.

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

Si notre CustomTableSeeder se trouve dans le même répertoire que DatabaseSeeder, nous devons utiliser comme ci-dessous:

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

dans notre fichier DatabaseSeeder; alors une autre erreur sera lancée qui dit: 'DB Class not found' alors nous devrions ajouter notre façade DB à notre fichier CustomTableSeeder comme ci-dessous:

use Illuminate\Support\Facades\DB;

ça a marché pour moi!

ivahidmontazer
la source
0

J'ai utilisé uniquement SINGLE FILE avec deux classes:

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
la source
0

Si vous avez copié les fichiers de départ de n'importe quel autre projet, vous devez exécuter la commande artisan php artisan db:seedsinon ça va.

Shahid Hussain
la source
0

j'ai [ReflectionException] Class Seeder does not existtrop et quand j'utilise composer dump-autoload, j'ai une erreurpreg_match(): JIT compilation failed: no more memory quand je l'exécute.

Ce que je l'ai fait est que je change ;pcre.jit=1pour pcre.jit=Offen php.ini ! Vous pouvez trouver le chemin en utilisant php --inidans votre terminal!

J'utilise mac avec php 7.3! J'espère que cela aidera n'importe lequel d'entre vous!

gerald heng
la source
0

Vous spécifiez probablement le .php extension et il n'a pas trouvé votre classe.

Ce que je faisais:

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

Ce qui a résolu mon problème: ce que je faisais:

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

J'ai eu la même erreur "exception de réflexion". La solution était de copier le fichier de classe sur le serveur, depuis dev, pour moi. erreur stupide, mais étant donné le nombre de fichiers que nous traitons, il est facile d'oublier de les copier sur le serveur à chaque fois.

JamesAD-0
la source
2
Cette réponse est très vague et est associée à votre configuration d'hébergement spécifique. Bien que votre contribution soit appréciée, cela peut ne pas aider les développeurs à rechercher des solutions à ce problème. Je pense que votre problème est dû au fait que vous laissez aux humains le soin de copier les fichiers sur le serveur. Il est encouragé d'avoir un pipeline CI où les fichiers sont automatiquement déployés sur le serveur :)
charj