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

问题描述 投票:0回答:15

当我运行 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);

    }

}
laravel composer-php laravel-5 laravel-artisan
15个回答
874
投票

您需要将

SongsTableSeeder
放入文件
SongsTableSeeder.php
中,与您的
DatabaseSeeder.php
文件位于同一目录中。

并且您需要在控制台中运行:

composer dump-autoload

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

php artisan db:seed

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


25
投票

我通过这样做解决了这个问题:

  1. 复制文件内容。
  2. 删除文件。
  3. 运行命令:php artisan make:seeder .
  4. 将文件内容复制回此文件中。

发生这种情况是因为我更改了文件名。不知道为什么修改后就不行了


23
投票

文件SongsTableSeeder.php应位于database/seeds目录或其子目录中。

你需要运行:

composer dump-autoload

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

18
投票

如果您迁移到

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


9
投票

SongsTableSeeder.php 应该位于数据库/种子目录中

控制台命令步骤:

composer dump-autoload

然后:

php artisan cache:clear

然后:

php artisan optimize

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

4
投票

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

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

显然您需要将

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


3
投票

不要忘记

composer dump-autoload
与自动加载有关 /
composer.json
的类映射部分。如果您需要更改播种机目录或使用多个目录来存储播种机,请注意这一点。

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

3
投票

您可能指定了

.php
扩展名,但它没有找到您的课程。

我在做什么:

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

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

php artisan db:seed --class=RolesPermissionsTableSeeder

1
投票

当您将项目迁移到

Laravel 8
并收到该错误时,您应该按照下面给出的一些步骤操作。

1.转到您的

composer.json
文件。

2.更改自动加载部分

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

"autoload": {
     "psr-4": {
         "App\\": "app/"
      },
      "classmap": [
         "database/seeds",
         "database/factories"
      ]
},

3.现在运行

composer dump-autoload
composer update

命令

4.最后运行命令

php artisan db:seed


0
投票

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

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

在我们的 DatabaseSeeder 文件中; 然后会抛出另一个错误:“未找到数据库类” 然后我们应该将数据库外观添加到我们的 CustomTableSeeder 文件中,如下所示:

use Illuminate\Support\Facades\DB;

它对我有用!


0
投票

我只使用了单个文件,其中包含以下两个类:

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
投票

如果您从任何其他项目复制了播种机文件,那么您需要运行 artisan 命令

php artisan db:seed
否则没问题。


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!希望对大家有所帮助!


0
投票

只需更改:

$this->call('SongsTableSeeder')

$this->call(SongsTableSeeder::class)


-5
投票

我有同样的“反射异常”错误。解决方案是将类文件从开发人员复制到服务器,对我来说。愚蠢的错误,但考虑到我们处理的文件数量,很容易忘记每次都将它们复制到服务器。

© www.soinside.com 2019 - 2024. All rights reserved.