Я использую 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
У меня все еще есть ключ даты.
Есть что-то, что я забыл?Как я могу отобразить поле даты только тогда, когда оно заполнено?