【问题标题】:Custom datetime format from DB in JMSSerializerBundleJMSSerializerBundle 中来自 DB 的自定义日期时间格式
【发布时间】:2016-05-12 19:23:20
【问题描述】:

我有一个简单的问题,但我不知道如何解决它。

我在 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);
}

但是那样做是没有意义的,所以我希望你有一些选择!

感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: symfony jmsserializerbundle


    【解决方案1】:

    好的,所以我一直在搜索,它真的很简单(实际上我只需要查看文档......)。

    您可以在 JMSSerializerBundle 中为特定类型/值创建处理程序。

    我添加了一个用于序列化日期时间对象的自定义处理程序:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多