【问题标题】:How to create Seed Scenarios in Laravel如何在 Laravel 中创建种子场景
【发布时间】:2020-01-25 13:35:02
【问题描述】:

Laravel 提供了一项功能,允许您创建在首次运行时启动应用程序所需的通用数据。种子通常包含国家列表、成分、用户角色,甚至可能是默认用户。

在编写测试时,您还可以使用 Faker 等创建临时数据集。

这两个功能都很棒,非常适合用途。

但是,有时我们需要对包含数十个表和数百或数千行数据(甚至数十万行)的 Laravel Web 应用程序进行手动测试。例如,如果我们要对 Web 应用程序进行负载测试,我们需要生成所有这些数据(而不是使用实际的生产数据)。

我想修改 artisan migrate --seed 命令以包含 --scenario=loadtesting 以告诉 Laravel 使用哪些种子文件,或者能够在种子文件中设置一个标记为 if ( 'loadtesting' == $scenario ) { $rows = 1000000; }

我查看了 Illuminate 文件夹(嗯,Illuminate 的子文件夹)中的 Seeder.php 类,但我没有看到任何中断种子创建过程流程的机会。

我想知道是否有人可以详细说明实现上述功能所需的步骤而不覆盖 Laravel 文件(确切地说,是供应商中的任何内容)。我怀疑Faker's ORM features 可以在推荐的任何解决方案中发挥关键作用。

提前致谢。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我可以告诉你我有时是怎么做的。 .envconfig 中的标志,用于设置要调用的播种器类。

    APP_DB_TESTING = 'scenario1';
    

    然后在播种机中

    public function run()
        {
            $this->call(UsersTableSeeder::class);
            $this->call(RolePermissionTableSeeder::class);
    
            if (config('app.scenario') === 'scenario1')
            {
                $this->call(CategoriesTableSeeder::class);
                $this->call(TagsTableSeeder::class);
                $this->call(ArticlesTableSeeder::class);
            }
    
        }
    

    或者您可以创建自定义artisan 命令来触发不同的播种机。例如,创建一个名为 LoadArticles 的自定义命令并添加:

    public function handle()
    {
        DB::table('articles')->truncate();
        $this->call('db:seed', ['--class' => 'ArticlesTableSeeder']);
    }
    

    然后您可以针对不同的测试情况调用它

    【讨论】:

    • 这是完美的。我们应该在哪里添加handle() 函数?
    • @TedStresen-Reuter handlelaravel command 方法
    • 在自定义工匠命令中。 php artisan make:command CustomTableSeeder。这样你就可以像任何其他工匠命令一样使用/调用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2017-05-07
    • 2019-05-10
    • 2021-03-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多