Микширование Accessor и SkipWhenEmpty в Сериализаторе JMS - PullRequest
0 голосов
/ 03 мая 2019

Я использую JMS-сериализатор в проекте, и я борюсь с одной вещью.

Я использую аннотацию @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"}

Первая строка - это управление.

Во второй строке, при отсутствии указания заголовка, в выводимом json нет клавиши «title», благодаря @SkipWhenEmpty

Но в третьей строке, даже при @SkipWhenEmptyУ меня все еще есть ключ даты.

Есть что-то, что я забыл?Как я могу отобразить поле даты только тогда, когда оно заполнено?

1 Ответ

2 голосов
/ 06 мая 2019

С моим исследованием, я думаю, вам нужно вернуть null, а не

return '';

в вашей функции getDate.

См

...