david-solus / reo-openimmo
重新排序的属性
Requires
- php: >=7.4
- ext-dom: *
- ext-simplexml: *
- cweagans/composer-patches: ^1.7 || ^2.0
- jms/serializer: ^2.1 || ^3.5
- dev-master
- v0.11.17
- v0.11.16
- v0.11.15
- v0.11.14
- v0.11.13
- v0.11.12
- v0.11.11
- v0.11.10
- v0.11.9
- v0.11.8
- v0.11.7
- v0.11.6
- v0.11.5
- v0.11.4
- v0.11.3
- v0.11.2
- v0.11.1
- v0.11.0
- v0.10.0
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- v0.8.1
- v0.8.0
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.1
- v0.3.0
- v0.2.0
- v0.1.1
- v0.1.0
- dev-dependabot/composer/phpstan/phpstan-tw-0.12or-tw-1.0
- dev-bugfix/issue-3
This package is auto-updated.
Last update: 2024-09-29 06:03:16 UTC
README
OpenImmo及其标志是OpenImmo e.V.的注册商标。此包不是官方发行版,我也与该组织无关!
此库只是用一些PHP7/8类包装了OpenImmo XML格式。
在http://www.openimmo.de/go.php/p/22/support20.htm有一个官方库可供使用,价格为95欧元(不含增值税),仅支持PHP5。为了完全说服您,您只有在付款后才能看到代码,并且他们有一个不退款的政策。
重要说明
此库是umajiis项目的分支。在这个版本中重新排序了属性。
由于许可证限制,我不得将真实世界的XML示例包含在此发行包中。因此,如果在示例目录中找不到XML文件,某些测试将自动跳过!不要被OpenImmo中的“开放”所迷惑 ;-)
用法
编写OpenImmo XML
// just create the elements you need in your xml and use the set-methods to fill in values. $nutzungsart = new Nutzungsart(); $nutzungsart ->setWohnen(true) ->setGewerbe(false) ->setAnlage(false) ->setWaz(false); $serializer = \JMS\Serializer\SerializerBuilder::create()->build(); echo $serializer->serialize($nutzungsart, 'xml');
将生成
<nutzungsart WOHNEN="true" GEWERBE="false" ANLAGE="false" WAZ="false" />
嵌套元素创建同样简单。类、属性、常量和参数与xsd文件中的对应项命名。它们只是转换为camelCase以符合PHP标准。
$infrastrktur = new Infrastruktur(); $infrastrktur ->setZulieferung(false) ->setAusblick((new Ausblick())->setBlick(Ausblick::BLICK_BERGE)) ->setDistanzenSport([ new DistanzenSport(DistanzenSport::DISTANZ_ZU_SPORT_SEE, 15) ]) ->setDistanzen([ new Distanzen(Distanzen::DISTANZ_ZU_HAUPTSCHULE, 22) ]); $serializer = \JMS\Serializer\SerializerBuilder::create()->build(); echo $serializer->serialize($infrastrktur, 'xml');
将生成
<infrastruktur> <ausblick blick="BERGE" /> <distanzen distanz_zu="HAUPTSCHULE" >22.0</distanzen> <distanzen_sport distanz_zu_sport="SEE" >15.0</distanzen_sport> <zulieferung>false</zulieferung> </infrastruktur>
读取OpenImmo XML
将数据从xml读取到易于使用的对象结构也很简单。此示例将生成一个对象列表(地址)。
$xmlString = file_get_contents('./example/foobar.xml'); /* @var $openImmo \Ujamii\OpenImmo\API\Openimmo */ $openImmo = $serializer->deserialize($xmlString, \Ujamii\OpenImmo\API\Openimmo::class, 'xml'); /* @var $anbieter \Ujamii\OpenImmo\API\Anbieter */ foreach ($openImmo->getAnbieter() as $anbieter) { /* @var $immobilie \Ujamii\OpenImmo\API\Immobilie */ foreach ($anbieter->getImmobilie() as $immobilie) { echo PHP_EOL . vsprintf('%s %s, %s %s', [ $immobilie->getGeo()->getStrasse(), $immobilie->getGeo()->getHausnummer(), $immobilie->getGeo()->getPlz(), $immobilie->getGeo()->getOrt(), ]); } }
编写JSON(自v0.10起)
尽管OpenImmo标准只描述了XML版本,但可能会有一些情况,您希望从给定数据生成JSON。遗憾的是,在JMS serializer中存在有关自定义类型、标量值和JSON序列化的问题(问题)。尽管如此,仍然可以使用Symfony serializer组件编写JSON格式。
composer require symfony/serializer
生成JSON的工作方式如下
use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; use Symfony\Component\Serializer\Serializer; $openImmoObject = null; // this may be any object of one of the API classes from this package $encoders = [new JsonEncoder()]; $normalizers = [ new DateTimeNormalizer(), new GetSetMethodNormalizer() ]; $serializerContext = [ AbstractObjectNormalizer::SKIP_NULL_VALUES => true, AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => false, 'json_encode_options' => \JSON_PRESERVE_ZERO_FRACTION ]; $serializer = new Serializer($normalizers, $encoders); $jsonContent = $this->serializer->serialize($openImmoObject, JsonEncoder::FORMAT, $serializerContext);
可能的问题
DateTime格式不起作用
一些工具可能在xml中生成DateTime值,这会导致错误,如下所示
Fatal error: Uncaught JMS\Serializer\Exception\RuntimeException: Invalid datetime "2020-08-07T11:56:39.1242974+02:00", expected one of the format "Y-m-d\TH:i:sP", "Y-m-d\TH:i:s".
这可能是由该值的微秒部分(1242974)的不同精度引起的。由于默认PHP精度可能低于生成xml的工具的精度,因此如果使用您使用的数据出现此问题,您可以将包含在此包中的处理程序添加到序列化器中,如下所示
use JMS\Serializer\Handler\HandlerRegistryInterface; use Ujamii\OpenImmo\Handler\DateTimeHandler; $builder = \JMS\Serializer\SerializerBuilder::create(); $builder ->configureHandlers(function(HandlerRegistryInterface $registry) { $registry->registerSubscribingHandler(new DateTimeHandler()); }) ; $serializer = $builder->build();
使用新的OpenImmo版本更新API类
- 安装composer包。
- 从他们的网站下载OpenImmo文件(提取到示例文件夹)。他们的许可协议禁止重新分配xsd文件。
php -f generate-api.php
将填充src/API
目录中的新类。- 使用
composer dumpautoload
更新自动加载。 - 完成。
运行测试
composer run phpunit
许可证和贡献
由于这是开源软件,您可以通过报告错误、改进代码、编写测试或您能做的任何其他事情来为项目做出贡献。
如果您想帮助我,请从我的Amazon愿望清单购买一些东西。
谢谢!
- Qbus Internetagentur GmbH 对您的代码贡献表示感谢