teamneusta / pimcore-fixture-bundle
提供基本功能以在 Pimcore 中安装固定装置
Requires
- php: ~8.1.0 || ~8.2.0
- pimcore/pimcore: ^10.5 || ^11.0
Requires (Dev)
- ergebnis/composer-normalize: ^2.42
- friendsofphp/php-cs-fixer: ^3.11
- laminas/laminas-zendframework-bridge: ^1.8
- phpspec/prophecy-phpunit: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.8
- phpstan/phpstan-phpunit: ^1.1
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
- teamneusta/pimcore-testing-framework: ^0.12
Conflicts
- presta/sitemap-bundle: <3.2
- symfony/form: <5.4
- symfony/routing: <5.4
This package is auto-updated.
Last update: 2024-09-11 07:14:39 UTC
README
提供一种管理和执行 Pimcore 中数据固定加载的方法。
这对于测试目的或向数据库注入初始数据可能很有用。
安装
-
需要此捆绑包
composer require teamneusta/pimcore-fixture-bundle
-
启用捆绑包
将捆绑包添加到您的
config/bundles.php
Neusta\Pimcore\FixtureBundle\NeustaPimcoreFixtureBundle::class => ['test' => true],
-
为服务自动配置注册您的固定文件夹
根据您想在何处创建固定装置或它们是否仅在测试执行期间可访问。
when@test: services: App\Tests\Fixture\: autoconfigure: true resource: '../tests/Fixture/'
从早期版本升级
现在将固定装置视为实际服务,并通过依赖注入(DI)加载。为了与这种做法保持一致,您需要通过将服务依赖项从 create
方法移动到构造函数来更新您的固定装置类。如果您的固定装置依赖于其他固定装置,请实现 HasDependencies
接口。
以下是关键更改
-
固定装置接口更新
旧的固定装置接口Neusta\Pimcore\FixtureBundle\Fixture
已被替换为Neusta\Pimcore\FixtureBundle\Fixture\Fixture
。您还可以从Neusta\Pimcore\FixtureBundle\Fixture\AbstractFixture
继承以实现您的固定装置。 -
create
方法的更改
已修改create
方法的签名。它不再接受任何参数,这意味着所有服务依赖项都必须通过依赖注入指定。这通常是通过构造函数完成的。 -
固定装置作为服务
固定装置必须可在依赖注入容器中可用以被发现。为此,请用neusta_pimcore_fixture.fixture
标记它们,或使用自动配置进行自动标记。 -
指定固定装置之间的依赖关系
如果您的固定装置依赖于其他固定装置,请使用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 提供以下事件以简化扩展和自定义
-
BeforeLoadFixtures
此事件在任何 fixture 执行之前触发。它包含所有计划执行的 fixtures,可以通过$event->getFixtures()
访问。您可以使用$event->setFixtures(...)
修改要加载的 fixtures 列表。 -
AfterLoadFixtures
此事件在所有相关 fixtures 执行完毕后发生。它携带已成功加载的 fixtures,可以通过$event->loadedFixtures
访问。 -
BeforeExecuteFixture
此事件在 fixture 执行之前触发。使用此事件,您可以通过设置$event->setPreventExecution(true)
阻止特定 fixture 的执行。 -
AfterExecuteFixture
此事件在 fixture 执行之后发生。
贡献
欢迎为任何错误、功能请求或其他想法提出问题。
请在创建大型 pull request 之前创建问题。
本地开发
要在本地机器上进行开发,需要供应商依赖。
bin/composer install
我们使用 composer 脚本作为主要质量工具。它们可以通过 bin/composer
文件执行。
bin/composer cs:fix bin/composer phpstan bin/composer tests