formatd / importer
此包为 Neos Flow 实体提供 XML 导入器。
Requires
- neos/flow: >=3.1.0
This package is auto-updated.
Last update: 2024-09-18 22:41:11 UTC
README
此包为 Neos Flow 实体提供 XML 导入器。
它做什么?
此包为 Neos Flow 实体提供 XML 导入器。通过创建遵循特定结构的 XML,您可以例如创建测试的 fixtures 或将其用于将数据导入到系统中,而对于这些数据您没有前端进行编辑。您还可以只将实体导入到内存中,并选择不持久化它们(例如,用于测试 fixtures)。
运行导入
一次性导入简单文件
./flow import:xml /path/to/xml-file.xml
导入和更新
如果您想稍后更新先前导入的数据,可以使用可选参数将 UUID 注入导入的 XML 中。这样,如果您更改并再次导入,则实体将被更新而不会再次创建。
./flow import:xml /path/to/xml-file.xml --enableXmlModification
您可以通过指定一个 id 来在 xml 中引用其他实体。如果您已经导入了一些内容,可以将这些数据加载到内存中,以便所有引用都被加载。
./flow import:xml /path/to/xml-file.xml --initializePathAndFilename="/path/to/other/files/with"
使用导入器为测试 fixtures
导入器可以用作创建功能测试或端到端测试 fixtures 的便捷方式。
如果您在功能测试中需要一些数据,您可以这样做
$importService->setPersistenceEnabled(FALSE);
$importService->importFromFile('/path/to/file');
$fixture = $importService->getImportedObjectByReference(My\Package\Domain\Model\ShippingRate:class, 'standard');
导入文件的 XML 结构
基本示例
以下是一个简单的导入文件的示例。它创建了两个 shippingRate 实体和两个 timeFrame 实体,它们引用其中一个 shipping rate。
<?xml version="1.0" encoding="UTF-8"?> <data> <meta> <repository type="My\Package\Domain\Model\ShippingRate" repositoryName="My\Package\Domain\Repository\ShippingRateRepository" /> <repository type="My\Package\Domain\Model\TimeFrame" repositoryName="My\Package\Domain\Repository\TimeFrameRepository" /> <repository type="Neos\Flow\Security\Account" repositoryName="Neos\Flow\Security\AccountRepository" /> </meta> <content> <!-- Arbitrary named nodes. The inner nodes are iterated and need a type property --> <shippingRates> <!-- specify an optional id=".." if you want to reference the imported entity later on --> <shippingRate id="standard" type="My\Package\Domain\Model\ShippingRate"> <properties> <name>Standard</name> <level type="integer">3</level> <cost type="double">3.90</cost> </properties> </shippingRate> <shippingRate id="stundengenau" type="My\Package\Domain\Model\ShippingRate"> <properties> <name>Stundengenau</name> <level type="integer">4</level> <cost type="double">5.90</cost> </properties> </shippingRate> </shippingRates> <timeFrames> <timeFrame id="8-9" type="My\Package\Domain\Model\TimeFrame"> <properties> <name>8 - 9 Uhr</name> <startTime type="DateTime"> <constructorArguments> <arg1>08:00:00</arg1> </constructorArguments> </startTime> <duration type="integer">1</duration> <defaultCapacity type="integer">5</defaultCapacity> <defaultShippingRate reference="stundengenau" type="My\Package\Domain\Model\ShippingRate" /> </properties> </timeFrame> <timeFrame id="9-10" type=">My\Package\Domain\Model\TimeFrame"> <properties> <name>9 - 10 Uhr</name> <startTime type="DateTime"> <constructorArguments> <arg1>09:00:00</arg1> </constructorArguments> </startTime> <duration type="integer">1</duration> <defaultCapacity type="integer">5</defaultCapacity> <defaultShippingRate reference="stundengenau" type="My\Package\Domain\Model\ShippingRate" /> </properties> </timeFrame> </timeFrames> </content> </data>
部分 <meta>
只包含用于哪个实体的存储库的映射。部分 <content>
包含任意命名的部分,例如我们的示例中的 <shippingRates>
。这些部分自身包含多个具有 type=""
属性的部分。
可以将导入的数据拆分为多个以三位数字为前缀的文件(请注意,在导入之前,文件是排序的)。您必须注意在引用它们之前,引用的实体已经导入。
000_MetaData.xml
010_ShippingRates.xml
020_TimeFrames.xml
嵌套和关系
您可以在单独的部分 <relations>
中定义关系(多对多或一对多)。
... <rule type="My\Package\Domain\Model\Rule"> <properties> <active type="boolean">TRUE</active> <name>Some rule to manage the TimeFrame 8-9</name> <priority type="integer">100</priority> <capacity type="integer">50</capacity> <shippingRate reference="stundengenau" type="My\Package\Domain\Model\ShippingRate" /> </properties> <relations> <zone reference="some-alrerady-imported-zone" type="My\Package\Domain\Model\Zone" /> <timeFrame reference="8-9" type="My\Package\Domain\Model\TimeFrame" /> <timeFrame reference="9-10" type="My\Package\Domain\Model\TimeFrame" /> </relations> </rule> ...
导入器递归工作,并导入嵌套结构。
... <rule type="My\Package\Domain\Model\Rule"> <properties> ... </properties> <relations> <zone reference="some-alrerady-imported-zone" type="My\Package\Domain\Model\Zone" /> <timeFrame reference="8-9" type="My\Package\Domain\Model\TimeFrame" /> <timeFrame reference="9-10" type="My\Package\Domain\Model\TimeFrame" /> <!-- this would also be possible: --> <timeFrame id="10-11" type=">My\Package\Domain\Model\TimeFrame"> <properties> <name>10 - 11 Uhr</name> <startTime type="DateTime"> <constructorArguments> <arg1>10:00:00</arg1> </constructorArguments> </startTime> <duration type="integer">1</duration> <defaultCapacity type="integer">5</defaultCapacity> <defaultShippingRate type="My\Package\Domain\Model\ShippingRate" > <properties> <name>Some other Rate</name> <level type="integer">6</level> <cost type="double">19.90</cost> </properties> </defaultShippingRate> </properties> </timeFrame> </relations> </rule> ...