ujamii/openimmo

PHP8 的 OpenImmo 库。使用 JMS Serializer 读取和写入 OpenImmo XML 格式。

资助包维护!
mgrundkoetter

v2.1.1 2024-03-06 14:21 UTC

README

Packagist Minimum PHP Version Continuous Integration codecov Mutation testing badge

OpenImmo 和 OpenImmo 标志是 OpenImmo e.V. 的注册商标。本包不是官方发行版,我与该组织无关!

此库只是用一些 PHP8 类包装了 OpenImmo XML 格式。如果您需要支持 PHP <= 8.1,请查看此包的 1.x 版本。版本 2 仅适用于 PHP >=8.2。

http://www.openimmo.de/go.php/p/22/support20.htm 处有一个官方库可用,不含增值税价格为 95 欧元,并与 "PHP5 兼容,并已在 PHP 8.1 上测试"(引号结束)。为了完全让您信服,您只能在付款后并遵守无退款政策的情况下查看代码。

重要说明

由于可能存在许可证和隐私问题,我不想将现实世界的 XML 示例包含在这个发行包中。因此,如果未在示例目录中找到 XML 文件,某些测试将自动跳过!OpenImmo 中的 "Open" 与开源无关(有人告诉我 ;-)

待办事项

  • 添加测试用例,特别是官方下载包中提供的示例文件。

安装

composer req ujamii/openimmo

集成

如果您想将此 API 作为集成到 CMS 或框架的基础,请随时联系我,我会在这里链接它。

使用

编写 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 的工具的精度,因此如果使用您使用的数据出现此问题,您可以将包含在此包中的处理程序添加到 serializer 中,如下所示

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 类

  1. 安装 composer 包。
  2. 他们的网站下载OpenImmo文件(解压到示例文件夹)。他们的许可协议禁止重新分发xsd文件。
  3. 使用php -f generate-api.php将为src/API目录填充新类。
  4. 使用composer dumpautoload更新自动加载。
  5. 完成。

正在运行测试

  1. 运行composer run phpunit

许可和贡献

GPLv3

由于这是一个开源项目,您可以通过报告错误、改进代码、编写测试或您能做的任何其他事情来为项目做出贡献。

如果您想帮我一个忙,请从我的亚马逊愿望清单购买一些东西。

谢谢!