在JMSSerializerBundle中从数据库获取自定义日期时间格式

3

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

我在Symfony2中使用FOSRestBundle + JMSSerializerBundle进行项目开发。 在我的实体中,我有一些日期时间字段,用户应该能够定义API检索到的日期时间格式,如下所示:

Input to define the datetime format

我的问题是我不知道如何告诉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);
}

但按照那种方式做没有意义,所以我希望你有一些替代方案!感谢你的时间和帮助。
1个回答

3

好的,我继续搜索,结果非常简单(实际上我只需要查看文档...)。

您可以在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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接