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

Posted

技术标签:

【中文标题】Laravel 5 - 工匠种子 [ReflectionException] 类 SongsTableSeeder 不存在【英文标题】:Laravel 5 - artisan seed [ReflectionException] Class SongsTableSeeder does not exist 【发布时间】:2014-11-26 09:48:34 【问题描述】:

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

    


【问题讨论】:

composer dump-autoload ? 我认为使用 Faker\Factory 作为 Faker; 是在做这项工作吗? 包含SongsTableSeeder 类定义的文件的路径是什么? 检查ReflectionException: Class ClassName does not exist - Laravel 这是垃圾和坏的 【参考方案1】:

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

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

composer dump-autoload

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

php artisan db:seed

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

【讨论】:

我没有在播种机课程中“使用”该模型。现在工作正常。 composer dumpautoload 也飞 composer dump-autoload 为我解决了这个问题。 composer dump-autoload 到底是做什么的? @LuísAlmeida dump-autoload 重新生成需要包含在项目中的所有类的列表,当您的项目中有一个新类时使用它。通常运行make:* 会添加新创建的类,但是如果您手动创建播种机,则不会发生这种情况。至少这就是我从 5 分钟的搜索中理解它的工作方式。我不是专家。 我在开发服务器上使用 Laravel 5.8 尝试了这个解决方案,composer dump-autoload 为我工作。【参考方案2】:

我通过这样做解决了它:

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

这是因为我更改了文件名。我不知道为什么更改后它不起作用。

【讨论】:

可能运行 composer dump-auto 更容易。自动加载器现在正在寻找一个较旧的文件。因此,如果您通过命令行转储此文件,它将使用新文件生成一个新的自动加载器文件。所以以后试试这个=) 有关 composer 自动加载器的更多信息,请参见此站点:getcomposer.org/doc/01-basic-usage.md#autoloading van Asseldok,好吧,composer dump-autoload 不适合我。我必须重新创建播种器类以使其正常工作。 这对我有帮助。 “composer dump-autoload”对我也不起作用,这与我的服务器设置有关,或者它是共享服务器这一事实。【参考方案3】:

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

你需要运行:

composer dump-autoload

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

【讨论】:

可以通过 'php artisan db:seed --class=SongsTableSeeder' 命令查看 Parse Error。谢谢!!【参考方案4】:

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

<?php

namespace Database\Seeders;

...

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

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

最后,做一个composer dump-autoload

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

【讨论】:

正是缺少的东西!谢谢 这需要得到更多的支持。在这里,接受我的投票并感谢。【参考方案5】:

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

控制台命令步骤:

composer dump-autoload

然后:

php artisan cache:clear

然后:

php artisan optimize

然后:

php artisan db:seed

或:

php artisan db:seed --class=SongsTableSeeder

【讨论】:

为我工作!尤其是php artisan optimize 部分【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

我在做什么:

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

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

php artisan db:seed --class=RolesPermissionsTableSeeder

【讨论】:

【参考方案9】:

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

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

在我们的 DatabaseSeeder 文件中; 然后会抛出另一个错误,上面写着:'DB Class not found' 那么我们应该将我们的 DB 外观添加到我们的 CustomTableSeeder 文件中,如下所示:

use Illuminate\Support\Facades\DB;

它对我有用!

【讨论】:

【参考方案10】:

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

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

    




【讨论】:

【参考方案11】:

如果您从任何其他项目复制了播种机文件,则需要运行 artisan 命令php artisan db:seed 否则没问题。

【讨论】:

【参考方案12】:

我也得到了[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!希望对大家有帮助!

【讨论】:

【参考方案13】:

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

【讨论】:

此响应非常模糊,并且与您的特定主机设置有关。尽管您的意见很有价值,但这可能无助于开发人员寻找此问题的解决方案。我认为您的问题是由于您将其留给人类将文件复制到服务器而引起的。鼓励有一个 CI 管道,其中文件会自动部署到服务器:)

以上是关于Laravel 5 - 工匠种子 [ReflectionException] 类 SongsTableSeeder 不存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.7 工匠迁移

Laravel 5.2 工匠“迁移”不起作用

在Laravel 5.3.30工匠指挥不起作用

工匠迁移:laravel 5.3 中的回滚错误

无法在工匠自定义命令 Laravel 5.4 中获取模型关系

如何在 laravel 5.1 中使用工匠制作视图