Laravel 5 - semente de artesão [ReflectionException] A classe SongsTableSeeder não existe

275

Quando executo o php artisan db: seed , estou recebendo o seguinte erro:

[ReflectionException] Class SongsTableSeeder does not exist

O que está acontecendo?

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

}

Classe 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
fonte
108
composer dump-autoload?
Thomas Jensen
Eu pensei usar Faker \ Factory como Faker; está fazendo o trabalho?
Sasha
Qual é o caminho para o arquivo que contém a SongsTableSeederdefinição de classe?
precisa
Isso é ruim e ruim #
Luigi Lopez

Respostas:

750

Você precisa colocar SongsTableSeederno arquivo SongsTableSeeder.phpno mesmo diretório em que está o seu DatabaseSeeder.phparquivo.

E você precisa executar no seu console:

composer dump-autoload

para gerar um novo mapa de classe e, em seguida, execute:

php artisan db:seed

Acabei de testar. Está funcionando sem problemas no Laravel 5

Marcin Nabiałek
fonte
1
Eu não estava 'usando' o modelo na minha classe de semeadora. Funciona bem agora.
Jamie Poole
1
composer dumpautoloadtambém voa
Connor Leech
O compositor dump-autoload resolveu o problema para mim. que compositor dump-autoload realmente faz?
Luís Almeida
5
@ LuísAlmeida dump-autoloadregenera a lista de todas as classes que precisam ser incluídas no projeto, é usada quando você tem uma nova classe dentro do projeto. Normalmente, a execução make:*adicionará a classe recém-criada, mas isso não ocorrerá se você criar manualmente um semeador. Pelo menos é assim que eu entendo que funcione após 5 minutos de pesquisa. Eu não sou especialista.
Xander Luciano
Eu tentei esta solução com o Laravel 5.8 em um servidor de desenvolvimento e composer dump-autoloadfuncionou para mim.
Mycodingproject
19

Eu resolvi fazendo isso:

  1. Copie o conteúdo do arquivo.
  2. Remover arquivo.
  3. Execute o comando: php artisan make: seeder.
  4. Copie o conteúdo do arquivo novamente neste arquivo.

Isso aconteceu porque eu fiz uma alteração no nome do arquivo. Não sei por que não funcionou após a mudança.

Ron van Asseldonk
fonte
2
Provavelmente executar o compositor dump-auto foi mais fácil. O carregador automático agora está procurando um arquivo mais antigo. Portanto, se você despejar esse arquivo via linha de comando, ele gerará um novo arquivo de carregador automático com o novo arquivo. Assim, no futuro tentar isso =)
Ron van Asseldonk
Para mais informações sobre autoloader compositor ver este site: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk
van Asseldok, bem, composer dump-autoloadnão funciona para mim. Preciso recriar a classe semeadora para fazê-la funcionar.
М.Б.
Isso me ajudou. 'composer dump-autoload' também não funciona para mim, algo a ver com as configurações do servidor ou o fato de ser um servidor compartilhado.
Derk Jan Speelman
16

O arquivo SongsTableSeeder.php deve estar no diretório database / seeds ou em seu subdiretório.

Você precisa executar:

composer dump-autoload

e depois:

php artisan db:seed

ou:

php artisan db:seed --class=SongsTableSeeder
simhumileco
fonte
1
pode ver o Erro de análise com o comando 'php artisan db: seed --class = SongsTableSeeder'. thnks !!
OmiK
4

SongsTableSeeder.php deve estar no diretório database / seeds

Etapas de comando do console:

composer dump-autoload

e depois:

php artisan cache:clear

e depois:

php artisan optimize

e depois:

php artisan db:seed

ou:

php artisan db:seed --class=SongsTableSeeder
Chandrakant Ganji
fonte
Trabalhou para mim! Especialmente a php artisan optimizeparte
Moses Ndeda 10/10
3

Estou executando a versão mais recente do Laravel 5 dev e, se você alterou o espaço para nome, precisará chamar sua classe inicial assim:

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

Obviamente, você precisará substituir todoparrotpelo seu espaço para nome designado. Caso contrário, recebo o mesmo erro indicado na pergunta original.

Jason
fonte
3

Não se esqueça que os composer dump-autoloadtrabalhos relacionados à seção autoload / classmap de composer.json. Tome cuidado com isso se precisar alterar o diretório de propagadores ou usar vários diretórios para armazenar os semeadores.

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

Se o nosso CustomTableSeeder estiver no mesmo diretório do DatabaseSeeder, devemos usar o seguinte:

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

no nosso arquivo DatabaseSeeder; será gerado outro erro que diz: 'Classe de banco de dados não encontrada'; em seguida, devemos adicionar nossa fachada de banco de dados ao nosso arquivo CustomTableSeeder, como abaixo:

use Illuminate\Support\Facades\DB;

funcionou para mim!

ivahidmontazer
fonte
0

Eu usei apenas SINGLE FILE com DUAS classes no seguinte:

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

Se você copiou os arquivos de propagadores de qualquer outro projeto, precisará executar o comando artisan, php artisan db:seedcaso contrário, tudo bem.

Shahid Hussain
fonte
0

[ReflectionException] Class Seeder does not existTambém recebi e quando uso composer dump-autoload, recebo um erro preg_match(): JIT compilation failed: no more memoryao executá-lo.

O que eu fiz é que eu mudar ;pcre.jit=1para pcre.jit=Offno php.ini ! Você pode encontrar o caminho usando php --inino seu terminal!

Estou usando o mac com php 7.3! Espero que ajude qualquer um de vocês por aí!

gerald heng
fonte
0

Você provavelmente especifica a .phpextensão e ela não encontrou sua classe.

O que eu estava fazendo:

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

O que resolveu meu problema: O que eu estava fazendo:

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

Eu tive o mesmo erro "exceção de reflexão". A solução foi copiar o arquivo de classe para o servidor, do dev, para mim. erro estúpido, mas, considerando quantos arquivos lidamos, é fácil esquecer de copiá-los para o servidor todas as vezes.

JamesAD-0
fonte
2
Essa resposta é muito vaga e acompanha sua configuração de hospedagem específica. Embora sua opinião seja valorizada, isso pode não ajudar os desenvolvedores a procurar soluções para esse problema. Acho que seu problema foi causado por você deixar que os humanos copiem arquivos para o servidor. É encorajados a ter um oleoduto CI onde os arquivos são automaticamente implantado no servidor :)
charj