📜  laravel 7 工厂修补程序 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:34.372000             🧑  作者: Mango

Laravel 7 工厂修补程序 - PHP

简介

Laravel 是一套经典且功能强大的 PHP 开发框架,拥有很多方便的特性。其中之一就是工厂(Factory)模式,它让我们可以轻松地创建模型(Model)并为其设置随机的数据。不过,早期的 Laravel 版本使用工厂时可能会出现一些 bug,这就需要使用工厂修补程序来修复。

工厂修补程序用法
安装

首先,我们需要在 Laravel 7 中安装 laravel-factory-patch 包。可以通过 Composer 执行以下命令进行安装:

composer require casperwilkes/laravel-factory-patch
修补程序的作用

对于 Laravel 7 的工厂中可能存在的 bug,我们可以使用一组工厂修补程序来解决。这个修补程序可以修复三个问题:

  1. 工厂可能会在创建模型时返回空白模型。
  2. 工厂在多个模型之间共享模型数据时会出现 state、define 和 raw 等方法冲突的问题。
  3. 工厂在多个模型之间共享默认数据时可能会出现模型共享的问题。
使用示例

在开始之前,请确保您已经在 Laravel 7 中安装了 laravel-factory-patch 包。

下面,我们可以考虑在测试中使用工厂修补程序。首先,我们需要在 bootstrap/app.php 文件中加入以下内容:

use CasperWilkes\Laravel\FactoryPatch\ServiceProvider as FactoryPatchServiceProvider;

$app->register(FactoryPatchServiceProvider::class);

接着,可以在 tests/TestCase.php 文件中新建一个 registerFactories 方法:

use Illuminate\Database\Eloquent\Factory;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    protected $factory;

    public function setUp(): void
    {
        parent::setUp();

        $this->factory = app(Factory::class);
    }

    public function registerFactories($factoryClass)
    {
        if (method_exists($factoryClass, 'configure')) {
            $factoryClass::configure($this->factory);
        }

        if (method_exists($factoryClass, 'definition')) {
            $factoryClass::definition($this->factory);
        }

        if (method_exists($factoryClass, 'states')) {
            $factoryClass::states($this->factory);
        }

        if (method_exists($factoryClass, 'raw')) {
            $factoryClass::raw($this->factory);
        }
    }
}

这个方法将会自动执行指定工厂类的 configure、definition、states 和 raw 方法。然后,我们就可以使用工厂类了。以下示例代码将使用 PostFactory 和 CommentFactory 创建一篇博客和一些评论:

class PostTest extends TestCase
{
    use RefreshDatabase;

    public function testCreatePostSuccess()
    {
        $this->registerFactories(PostFactory::class);
        $this->registerFactories(CommentFactory::class);

        $post = factory(Post::class)->create([
            'title' => 'Test Title',
            'content' => 'Test Content',
        ]);

        $this->assertDatabaseHas('posts', [
            'title' => 'Test Title',
            'content' => 'Test Content',
        ]);

        $comment1 = factory(Comment::class)->create([
            'post_id' => $post->id,
            'content' => 'Test Comment 1',
        ]);

        $comment2 = factory(Comment::class)->create([
            'post_id' => $post->id,
            'content' => 'Test Comment 2',
        ]);

        $this->assertDatabaseHas('comments', [
            'post_id' => $post->id,
            'content' => 'Test Comment 1',
        ]);

        $this->assertDatabaseHas('comments', [
            'post_id' => $post->id,
            'content' => 'Test Comment 2',
        ]);
    }
}
结论

有了工厂修补程序,我们可以轻松地创建 Laravel 7 中的模型,并修复可能的 bug。这个修补程序为我们提供了更好、更便捷和更高效的开发体验。