formatd/importer

此包为 Neos Flow 实体提供 XML 导入器。

安装: 5

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:neos-package

v1.0.0 2019-09-18 11:26 UTC

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