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>
...