JMSSerializerBundle 中来自数据库的自定义日期时间格式
Custom datetime format from DB in JMSSerializerBundle
我有一个简单的问题,但我不知道如何解决。
我在 Symfony2 中有一个带有 FOSRestBundle + JMSSerializerBundle 的项目。
在我的实体中,我有一些日期时间字段,用户应该能够定义 API 检索到的日期时间的格式,如您所见:
我的问题是我不知道如何告诉 JMSSerializerBundle 为我的日期时间字段使用用户定义的格式。
目前我有这个:
/**
* @var \DateTime
*
* @ORM\Column(name="custom_date", type="datetime")
* @Serializer\Type("DateTime<Y-m-d>")
* @Serializer\Expose
*/
protected $custom_date;
我找到的唯一方法是使用 JMSSerializerBundle 中的 VirtualProperty 方法,但这意味着我的实体 必须 与用户有关系。
类似的东西:
/**
* @Serializer\VirtualProperty
* @Serializer\Type("string")
* @Serializer\SerializedName("custom_date")
*/
public function getVPCustomDate() {
$format = $this->user->getSetting('date_format');
return $this->custom_date->format($format);
}
但那样做是没有意义的,所以我希望你有其他选择!
感谢您的宝贵时间和帮助。
好的,所以我一直在寻找,它真的很简单(实际上我只需要查看文档...)。
您可以在 JMSSerializerBundle 中为特定的 type/value 创建处理程序。
我添加了一个用于序列化日期时间对象的自定义处理程序:
namespace CoreBundle\EventListener;
use Symfony\Component\Security\Core\SecurityContext;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\Context;
class SerializerHandler implements SubscribingHandlerInterface
{
private $user;
public function __construct(SecurityContext $context)
{
$this->user = null;
if (!is_null($context->getToken()) && !is_null($context->getToken()->getUser())) {
$this->user = $context->getToken()->getUser();
}
}
public static function getSubscribingMethods()
{
return array(
array(
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'DateTime',
'method' => 'serializeDateTimeToJson',
),
);
}
public function serializeDateTimeToJson(JsonSerializationVisitor $visitor, \DateTime $date, array $type, Context $context)
{
if (
!is_null($this->user) &&
!is_null($this->user->getClient()) &&
!is_null($setting = $this->user->getClient()->getSingleSetting('date_format'))
) {
return $date->format($setting->getValue());
}
return $date->format('Y-m-d H:i:s');
}
}
并将其添加到 services.yml 中:
core.handler.serializer:
class: CoreBundle\EventListener\SerializerHandler
arguments:
- "@security.context"
tags:
- { name: jms_serializer.subscribing_handler }
就是这样。就这么简单。
有关更多信息,您可以在此处阅读有关处理程序的信息:
http://jmsyst.com/libs/serializer/master/handlers
我有一个简单的问题,但我不知道如何解决。
我在 Symfony2 中有一个带有 FOSRestBundle + JMSSerializerBundle 的项目。 在我的实体中,我有一些日期时间字段,用户应该能够定义 API 检索到的日期时间的格式,如您所见:
我的问题是我不知道如何告诉 JMSSerializerBundle 为我的日期时间字段使用用户定义的格式。 目前我有这个:
/**
* @var \DateTime
*
* @ORM\Column(name="custom_date", type="datetime")
* @Serializer\Type("DateTime<Y-m-d>")
* @Serializer\Expose
*/
protected $custom_date;
我找到的唯一方法是使用 JMSSerializerBundle 中的 VirtualProperty 方法,但这意味着我的实体 必须 与用户有关系。 类似的东西:
/**
* @Serializer\VirtualProperty
* @Serializer\Type("string")
* @Serializer\SerializedName("custom_date")
*/
public function getVPCustomDate() {
$format = $this->user->getSetting('date_format');
return $this->custom_date->format($format);
}
但那样做是没有意义的,所以我希望你有其他选择!
感谢您的宝贵时间和帮助。
好的,所以我一直在寻找,它真的很简单(实际上我只需要查看文档...)。
您可以在 JMSSerializerBundle 中为特定的 type/value 创建处理程序。
我添加了一个用于序列化日期时间对象的自定义处理程序:
namespace CoreBundle\EventListener;
use Symfony\Component\Security\Core\SecurityContext;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\Context;
class SerializerHandler implements SubscribingHandlerInterface
{
private $user;
public function __construct(SecurityContext $context)
{
$this->user = null;
if (!is_null($context->getToken()) && !is_null($context->getToken()->getUser())) {
$this->user = $context->getToken()->getUser();
}
}
public static function getSubscribingMethods()
{
return array(
array(
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'DateTime',
'method' => 'serializeDateTimeToJson',
),
);
}
public function serializeDateTimeToJson(JsonSerializationVisitor $visitor, \DateTime $date, array $type, Context $context)
{
if (
!is_null($this->user) &&
!is_null($this->user->getClient()) &&
!is_null($setting = $this->user->getClient()->getSingleSetting('date_format'))
) {
return $date->format($setting->getValue());
}
return $date->format('Y-m-d H:i:s');
}
}
并将其添加到 services.yml 中:
core.handler.serializer:
class: CoreBundle\EventListener\SerializerHandler
arguments:
- "@security.context"
tags:
- { name: jms_serializer.subscribing_handler }
就是这样。就这么简单。 有关更多信息,您可以在此处阅读有关处理程序的信息: http://jmsyst.com/libs/serializer/master/handlers