Laravel 5 - 工匠种子[ReflectionException]类SongsTableSeeder不存在

时间:2014-10-01 14:05:56

标签: laravel composer-php laravel-5 artisan

当我运行 php artisan db:seed 时,我收到以下错误:

[ReflectionException] Class SongsTableSeeder does not exist

发生了什么事?

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

}

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

    }

}

13 个答案:

答案 0 :(得分:559)

您需要将SongsTableSeeder放入文件SongsTableSeeder.php中与您拥有DatabaseSeeder.php文件的目录中。

你需要在你的控制台中运行:

composer dump-autoload

生成新的类映射,然后运行:

php artisan db:seed

我刚试过它。它在Laravel 5中没有问题

答案 1 :(得分:17)

我这样解决了这个问题:

  1. 复制文件内容。
  2. 删除文件。
  3. 运行命令:php artisan make:seeder。
  4. 将文件内容复制回此文件中。
  5. 这是因为我对文件名进行了更改。我不知道为什么在改变之后它没有工作。

答案 2 :(得分:9)

文件 SongsTableSeeder.php 应位于数据库/种子目录或其子目录中。

您需要运行:

composer dump-autoload

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

答案 3 :(得分:3)

我正在运行最新的Laravel 5 dev版本,如果你更改了命名空间,你需要像这样调用你的种子类:

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

显然,您需要将todoparrot替换为指定的命名空间。否则我会收到原始问题中指出的相同错误。

答案 4 :(得分:2)

SongsTableSeeder.php应该在database / seeds目录中

控制台命令步骤:

composer dump-autoload

然后:

php artisan cache:clear

然后:

php artisan optimize

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

答案 5 :(得分:2)

不要忘记composer dump-autoload与自动加载有关  / composer.json的/ classmap部分。如果需要更改播种器目录或使用多个目录存储播种器,请多加注意。

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

答案 6 :(得分:2)

如果您迁移到Laravel 8,则必须向namespace类添加seeders

<?php

namespace Database\Seeders;

...

接下来,在您的composer.json文件中,从classmap部分中删除autoload块,并添加新的命名空间的类目录映射:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Seeders\\": "database/seeds/"
    }
},

最后,做一个composer dump-autoload

有关更多信息: https://laravel.com/docs/8.x/upgrade#seeder-factory-namespaces

答案 7 :(得分:1)

您可能指定了.php扩展名,但找不到您的课程。

我在做什么:

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

什么解决了我的问题: 我在做什么:

php artisan db:seed --class=RolesPermissionsTableSeeder

答案 8 :(得分:0)

如果我们的CustomTableSeeder与DatabaseSeeder位于同一目录中,我们应该使用如下:

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

在我们的DatabaseSeeder文件中; 然后会抛出另一个错误:&#39; DB Class not found&#39; 然后我们应该将我们的数据库外观添加到我们的CustomTableSeeder文件中,如下所示:

use Illuminate\Support\Facades\DB;

它对我有用!

答案 9 :(得分:0)

我在其中仅使用了两个类的SINGLE FILE:

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

    }

}

}

答案 10 :(得分:0)

如果您从任何其他项目复制了种子文件,则需要运行artisan命令php artisan db:seed,否则就可以了。

答案 11 :(得分:0)

我也得到了[ReflectionException] Class Seeder does not exist,当我使用composer dump-autoload时,运行它时出现了错误preg_match(): JIT compilation failed: no more memory

我所做的是在 php.ini 中将;pcre.jit=1更改为pcre.jit=Off! 您可以在终端中使用php --ini来找到路径!

我在php 7.3中使用mac!希望对大家有帮助!

答案 12 :(得分:-1)

我有相同的&#34;反射异常&#34;错误。解决方案是将类文件从dev复制到服务器。愚蠢的错误,但考虑到我们处理了多少文件,每次都很容易忘记将它们复制到服务器上。