2016-02-03 46 views
3

我有一個簡單的問題,但我不知道如何解決它。JMSSerializerBundle中DB自定義日期時間格式

我有一個項目在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); 
} 

但是,如果沒有意義的這樣做的,所以我希望你有一些替代品!

感謝您的時間和您的幫助。

回答

3

好吧,所以我一直在尋找,而且它非常簡單(我只需要查看文檔實際上...)。

您可以在JMSSerializerBundle中爲特定類型/值創建處理程序。

我加了一個自定義處理程序序列化DateTime對象:

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