Laravel 5 - semilla artesanal [ReflectionException] Class SongsTableSeeder no existe

275

Cuando ejecuto php artisan db: seed obtengo el siguiente error:

[ReflectionException] Class SongsTableSeeder does not exist

Que esta pasando?

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

}

Mi clase 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
fuente
109
composer dump-autoload?
Thomas Jensen
Pensé usar Faker \ Factory como Faker; está haciendo el trabajo?
Sasha
¿Cuál es la ruta al archivo que contiene la SongsTableSeederdefinición de clase?
Wouter J
Esto es basura y malo
Luigi Lopez

Respuestas:

750

Debe colocar el SongsTableSeederarchivo SongsTableSeeder.phpen el mismo directorio donde tiene su DatabaseSeeder.phparchivo.

Y necesitas correr en tu consola:

composer dump-autoload

para generar un nuevo mapa de clase y luego ejecutar:

php artisan db:seed

Lo acabo de probar. Está funcionando sin problemas en Laravel 5

Marcin Nabiałek
fuente
1
No había estado 'usando' el modelo en mi clase de sembradora. Funciona bien ahora.
Jamie Poole
1
composer dumpautoloadtambién vuela
Connor Leech
composer dump-autoload me resolvió el problema. ¿Qué hace realmente el compositor dump-autoload?
Luís Almeida
55
@ LuísAlmeida dump-autoloadregenera la lista de todas las clases que deben incluirse en el proyecto, se usa cuando tiene una nueva clase dentro de su proyecto. Normalmente, la ejecución make:*agregará la clase recién creada, pero esto no ocurrirá si crea manualmente una sembradora. Al menos así es como entiendo que funcione después de 5 minutos de búsqueda. No soy un experto
Xander Luciano
Probé esta solución con Laravel 5.8 en un servidor de desarrollo y composer dump-autoloadtrabajé para mí.
Mycodingproject
19

Lo resolví haciendo esto:

  1. Copie el contenido del archivo.
  2. Remover archivo.
  3. Ejecute el comando: php artisan make: seeder.
  4. Copie el contenido del archivo nuevamente en este archivo.

Esto sucedió porque hice un cambio en el nombre del archivo. No sé por qué no funcionó después del cambio.

Ron van Asseldonk
fuente
2
Probablemente ejecutar composer dump-auto fue más fácil. El autocargador ahora está buscando un archivo anterior. Entonces, si volca este archivo a través de la línea de comando, generará un nuevo archivo de autocargador con el nuevo archivo. Así que en el futuro intente esto =)
Ron van Asseldonk
Para obtener más información sobre el autocargador de compositores, consulte este sitio: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk
van Asseldok, bueno, composer dump-autoloadno me funciona. Debo recrear la clase de sembradora para que funcione.
М.Б.
Esto me ayudo. 'composer dump-autoload' tampoco funciona para mí, algo relacionado con la configuración de mi servidor o el hecho de que es un servidor compartido.
Derk Jan Speelman
16

El archivo SongsTableSeeder.php debe estar en el directorio de base de datos / semillas o en su subdirectorio.

Necesitas ejecutar:

composer dump-autoload

y entonces:

php artisan db:seed

o:

php artisan db:seed --class=SongsTableSeeder
simhumileco
fuente
1
capaz de ver el error de análisis con el comando 'php artisan db: seed --class = SongsTableSeeder'. gracias !!
OmiK
4

SongsTableSeeder.php debe estar en el directorio de base de datos / semillas

Pasos de comando de la consola:

composer dump-autoload

y entonces:

php artisan cache:clear

y entonces:

php artisan optimize

y entonces:

php artisan db:seed

o:

php artisan db:seed --class=SongsTableSeeder
Chandrakant Ganji
fuente
¡Trabajó para mi! Especialmente la php artisan optimizeparte
Moses Ndeda
3

Estoy ejecutando la última versión de desarrollo de Laravel 5, y si ha cambiado el espacio de nombres, deberá llamar a su clase semilla de esta manera:

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

Obviamente, deberá reemplazarlo todoparrotcon su espacio de nombre designado. De lo contrario, recibo el mismo error indicado en la pregunta original.

Jason
fuente
3

No olvide que composer dump-autoloadfunciona en relación con la sección de carga automática / mapa de clase de composer.json. Tenga cuidado con eso si necesita cambiar el directorio de sembradoras o usar múltiples directorios para almacenar sembradoras.

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

Si nuestro CustomTableSeeder está en el mismo directorio que DatabaseSeeder, deberíamos usarlo como a continuación:

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

en nuestro archivo DatabaseSeeder; luego se lanzará otro error que dice: 'Clase DB no encontrada', entonces deberíamos agregar nuestra fachada DB a nuestro archivo CustomTableSeeder como se muestra a continuación:

use Illuminate\Support\Facades\DB;

¡funcionó para mí!

ivahidmontazer
fuente
0

Solo he usado UN SOLO ARCHIVO con DOS clases en el siguiente:

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

Si ha copiado los archivos de las sembradoras de cualquier otro proyecto, debe ejecutar el comando artesanal; de lo php artisan db:seedcontrario, está bien.

Shahid Hussain
fuente
0

[ReflectionException] Class Seeder does not existtambién tengo y cuando lo uso composer dump-autoload, recibo un errorpreg_match(): JIT compilation failed: no more memory cuando lo ejecuto.

Lo que hice es que puedo cambiar ;pcre.jit=1a pcre.jit=Offen php.ini ! Puedes encontrar el camino usandophp --ini en tu terminal!

Estoy usando mac con php 7.3! Espero que ayude a cualquiera de ustedes por ahí!

gerald heng
fuente
0

Probablemente especifique el .php extensión y no encontró su clase.

Lo que estaba haciendo :

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

Lo que resolvió mi problema: lo que estaba haciendo:

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

Tuve el mismo error de "excepción de reflexión". La solución fue copiar el archivo de clase en el servidor, desde dev, para mí. error tonto, pero dada la cantidad de archivos con los que tratamos, es fácil olvidar copiarlos al servidor cada vez.

JamesAD-0
fuente
2
Esta respuesta es muy vaga y se combina con su configuración de alojamiento específica. Aunque su aporte es valioso, esto puede no ayudar a los desarrolladores que buscan soluciones a este problema. Creo que su problema es causado por dejar que los humanos copien archivos al servidor. Se recomienda tener una canalización de CI donde los archivos se implementan automáticamente en el servidor :)
charj