在JMS序列化器中混合访问器和SkipWhenEmpty

时间:2019-05-03 15:39:57

标签: php jms-serializer

我在项目中使用JMS serializer,但我正为一件事情而苦苦挣扎。

我正在使用@Accessor批注(在DateTime属性上)仅回显日期而没有时间。但是在我的某些对象上,我没有任何信息,并且我不希望在这种情况发生时输出日期密钥。

如果没有@Accessor,我可以轻松使用@SkipWhenEmpty,它可以完美地适用于其他属性。但是看来我不能将两者混在一起?

这是我的示例代码:

composer.json

{
    "require": {
        "jms/serializer": "^1.14"
    }
}

StackOverflowExample.php

<?php

declare(strict_types=1);

use JMS\Serializer\Annotation as Serializer;

class StackOverflowExample
{
    /**
     * @var \DateTime
     * @Serializer\Accessor(getter="getDate")
     * @Serializer\SkipWhenEmpty()
     */
    private $date;

    /**
     * @var string
     * @Serializer\SkipWhenEmpty()
     */
    private $title;

    public function getDate(): string
    {
        if (null === $this->date) {
            return '';
        }

        return $this->date->format('Y-m-d');
    }

    public function setDate(\DateTime $date): void
    {
        $this->date = $date;
    }

    public function getTitle(): string
    {
        return $this->title;
    }

    public function setTitle(string $title): void
    {
        $this->title = $title;
    }
}

stackoverflow.php

<?php

$loader = require __DIR__.'/../vendor/autoload.php';
require_once __DIR__.'/StackOverflowExample.php';
\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, 'loadClass']);

$serializer = \JMS\Serializer\SerializerBuilder::create()->build();

$testWithDateAndTitle = new StackOverflowExample();
$testWithDateAndTitle->setDate(new DateTime());
$testWithDateAndTitle->setTitle('Example with date and title');

$testWithDateAndNoTitle = new StackOverflowExample();
$testWithDateAndNoTitle->setDate(new DateTime());

$testWithNoDateButTitle = new StackOverflowExample();
$testWithNoDateButTitle->setTitle('Example with title but no date');

echo $serializer->serialize($testWithDateAndTitle, 'json').PHP_EOL;
echo $serializer->serialize($testWithDateAndNoTitle, 'json').PHP_EOL;
echo $serializer->serialize($testWithNoDateButTitle, 'json').PHP_EOL;

执行stackoverflow.php时,这是它输出的数据:

{"date":"2019-05-03","title":"Example with date and title"}
{"date":"2019-05-03"}
{"date":"","title":"Example with title but no date"}

第一行是一个控件。

在第二行,由于省略了@SkipWhenEmpty

,当省略设置标题时,输出的json中没有“ title”键。

但是在第三行,即使使用@SkipWhenEmpty,我仍然拥有日期键。

有什么我要忘记的东西吗?仅在填满日期字段时,我该如何回声?

1 个答案:

答案 0 :(得分:3)

根据我的研究,我认为您需要返回null而不是

  

返回'';

在您的getDate函数中。

See