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);

    }

}

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


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.


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

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

¡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.


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"
    ],
},

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í!


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)]);

    }

}

}

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.


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í!


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

-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.