teamneusta/pimcore-fixture-bundle

提供基本功能以在 Pimcore 中安装固定装置

安装次数: 1,631

依赖项: 0

建议者: 0

安全: 0

星标: 4

关注者: 11

分支: 0

开放问题: 1

类型:pimcore-bundle

2.1.0 2024-07-02 08:05 UTC

This package is auto-updated.

Last update: 2024-09-11 07:14:39 UTC


README

提供一种管理和执行 Pimcore 中数据固定加载的方法。

这对于测试目的或向数据库注入初始数据可能很有用。

安装

  1. 需要此捆绑包

    composer require teamneusta/pimcore-fixture-bundle
  2. 启用捆绑包

    将捆绑包添加到您的 config/bundles.php

    Neusta\Pimcore\FixtureBundle\NeustaPimcoreFixtureBundle::class => ['test' => true],
  3. 为服务自动配置注册您的固定文件夹

    根据您想在何处创建固定装置或它们是否仅在测试执行期间可访问。

    when@test:
      services:
        App\Tests\Fixture\:
          autoconfigure: true
          resource: '../tests/Fixture/'

从早期版本升级

现在将固定装置视为实际服务,并通过依赖注入(DI)加载。为了与这种做法保持一致,您需要通过将服务依赖项从 create 方法移动到构造函数来更新您的固定装置类。如果您的固定装置依赖于其他固定装置,请实现 HasDependencies 接口。

以下是关键更改

  1. 固定装置接口更新
    旧的固定装置接口 Neusta\Pimcore\FixtureBundle\Fixture 已被替换为 Neusta\Pimcore\FixtureBundle\Fixture\Fixture。您还可以从 Neusta\Pimcore\FixtureBundle\Fixture\AbstractFixture 继承以实现您的固定装置。

  2. create 方法的更改
    已修改 create 方法的签名。它不再接受任何参数,这意味着所有服务依赖项都必须通过依赖注入指定。这通常是通过构造函数完成的。

  3. 固定装置作为服务
    固定装置必须可在依赖注入容器中可用以被发现。为此,请用 neusta_pimcore_fixture.fixture 标记它们,或使用自动配置进行自动标记。

  4. 指定固定装置之间的依赖关系
    如果您的固定装置依赖于其他固定装置,请使用 HasDependencies 接口指定这些依赖项。有关更多信息,请参阅 "引用固定装置和依赖其他固定装置" 部分。

请确保根据这些更改更新您的固定装置类,以确保正确的功能和与该捆绑包的兼容性。

用法

编写固定装置

数据固定装置是 PHP 服务类,您在其中创建对象并将它们持久化到数据库中。

假设您想在数据库中添加一些 Product 对象。为此,创建一个固定装置类并开始添加产品

use Neusta\Pimcore\FixtureBundle\Fixture\AbstractFixture;
use Pimcore\Model\DataObject\Product;

final class ProductFixture extends AbstractFixture
{
    public function create(): void
    {
        for ($i = 1; $i <= 20; $i++) {
            $product = new Product();
            $product->setParentId(0);
            $product->setPublished(true);
            $product->setKey("Product {$i}");
            // ...

            $product->save();
        }
    }
}

引用固定装置和依赖其他固定装置

假设您想将 Product 固定装置链接到 Group 固定装置。为此,您需要首先创建一个 Group 固定装置并保留对其的引用。稍后,您可以在创建 Product 固定装置时使用此引用。

此过程需要 Group 固定装置在 Product 固定装置之前存在。您可以通过实现 HasDependencies 接口来实现这种排序。

use Neusta\Pimcore\FixtureBundle\Fixture\AbstractFixture;
use Pimcore\Model\DataObject\ProductGroup;

final class ProductGroupFixture extends AbstractFixture
{
    public function create(): void
    {
        $productGroup = new ProductGroup();
        $productGroup->setParentId(0);
        $productGroup->setPublished(true);
        $productGroup->setKey('My Product Group');
        $productGroup->save();
        
        $this->addReference('my-product-group', $productGroup);
    }
}
use Neusta\Pimcore\FixtureBundle\Fixture\AbstractFixture;
use Neusta\Pimcore\FixtureBundle\Fixture\HasDependencies;
use Pimcore\Model\DataObject\Product;
use Pimcore\Model\DataObject\ProductGroup;

final class ProductFixture extends AbstractFixture implements HasDependencies
{
    public function create(): void
    {
        $productGroup = $this->getReference('my-product-group', ProductGroup::class);
    
        $product = new Product();
        $product->setParentId(0);
        $product->setPublished(true);
        $product->setKey('My grouped Product');
        $product->setProductGroup($productGroup);
        $product->save();
    }

    public function getDependencies(): array
    {
        return [
            ProductGroupFixture::class,
        ];
    }
}

加载固定装置

要加载测试中的固定装置,我们提供了 SelectiveFixtureLoader。为了简化您的测试设置,我们建议创建一个基类,其中包含一个使用 SelectiveFixtureLoader 加载固定装置的方法。以下是一个演示如何实现此方法的示例。

use Neusta\Pimcore\FixtureBundle\Fixture;
use Pimcore\Test\KernelTestCase;

abstract class BaseKernelTestCase extends KernelTestCase
{
    /**
     * @param list<class-string<Fixture>> $fixtures
     */
    protected function importFixtures(array $fixtures): void
    {
        /** @var SelectiveFixtureLoader $fixtureLoader */
        $fixtureLoader = static::getContainer()->get(SelectiveFixtureLoader::class);
        $fixtureLoader->setFixturesToLoad($fixtures)->loadFixtures();
    }

    protected function tearDown(): void
    {
        \Pimcore\Cache::clearAll();
        \Pimcore::collectGarbage();

        parent::tearDown();
    }
}

如下使用基类

use Pimcore\Model\DataObject;

final class MyCustomTest extends BaseKernelTestCase
{
    /** @test */
    public function import_fixtures(): void
    {
        $this->importFixtures([
            ProductFixture::class,
        ]);

        $productFixture = DataObject::getByPath('/product-1');

        self::assertNotNull($productFixture);
    }
}

要加载本地环境中的固定装置或作为部署的一部分,提供了两个命令

  • neusta:pimcore-fixture:load(加载定义的固定装置类。)
  • neusta:pimcore-fixtures:load(加载所有定义的固定装置类。)

请注意,加载大量对象可能会导致内存消耗过高。如果在 dev 环境中运行命令时遇到内存问题,您可能需要尝试将环境设置为 prod。禁用调试模式似乎也有助于减少内存消耗。

例如,在使用 symfony 控制台时提供以下选项

bin/console --env=prod --no-debug neusta:pimcore-fixtures:load

从 Fixtures 访问服务

由于 Fixtures 只是普通的 PHP 服务,您可以像往常一样使用所有 DI 功能,如构造函数、设置器或属性注入。

通过事件进行扩展和自定义

此 Bundle 提供以下事件以简化扩展和自定义

  1. BeforeLoadFixtures
    此事件在任何 fixture 执行之前触发。它包含所有计划执行的 fixtures,可以通过 $event->getFixtures() 访问。您可以使用 $event->setFixtures(...) 修改要加载的 fixtures 列表。

  2. AfterLoadFixtures
    此事件在所有相关 fixtures 执行完毕后发生。它携带已成功加载的 fixtures,可以通过 $event->loadedFixtures 访问。

  3. BeforeExecuteFixture
    此事件在 fixture 执行之前触发。使用此事件,您可以通过设置 $event->setPreventExecution(true) 阻止特定 fixture 的执行。

  4. AfterExecuteFixture
    此事件在 fixture 执行之后发生。

贡献

欢迎为任何错误、功能请求或其他想法提出问题。

请在创建大型 pull request 之前创建问题。

本地开发

要在本地机器上进行开发,需要供应商依赖。

bin/composer install

我们使用 composer 脚本作为主要质量工具。它们可以通过 bin/composer 文件执行。

bin/composer cs:fix
bin/composer phpstan
bin/composer tests