Symfony 3 - 自动序列化 DateTime 对象

5 php symfony doctrine-orm

在我的项目中,我有一些带有createdAt列的实体。

//...
class Acme
{
    /**
     * @var DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;
}
Run Code Online (Sandbox Code Playgroud)

我已启用FOSRestBundleSymfony 序列化程序:

fos_rest:
    disable_csrf_role: ROLE_API
    param_fetcher_listener: true
    body_listener: true
    format_listener:
        rules:
            - { path: '/', fallback_format: json, prefer_extension: false }
    routing_loader:
        default_format: json
        include_format: false
    view:
        view_response_listener: force
Run Code Online (Sandbox Code Playgroud)

我从数据库中选择AcmeRepository

public function methodName() 
{
   $qb =  $this->createQueryBuilder('d');
   $s = $qb->select('d.createdAt']);

   return $s->getQuery()->getArrayResult();
}
Run Code Online (Sandbox Code Playgroud)

结果,在我的控制器中:

$res = $em->getRepository('AppBundle:Acme')->methodName();
return $res;
Run Code Online (Sandbox Code Playgroud)

它返回 json,但[{"created_at": "2016-04-04 12:13:13"}] 我得到的不是这个:

[{"created_at":{"timezone":{"name":"UTC","location":{"country_code":"??","latitude":0,"longitude":0,"comments":""}},"offset":0,"timestamp":1459769277}]
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Mat*_*teo 5

您可以使用正确的注释类型指定为 FOS REST 模块定义的类型的格式(查看此处的文档)。例如:

use JMS\Serializer\Annotation\Type as JMS;

class Acme
{
    /**
     * @var DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     * @JMS\Type("DateTime<'Y-m-d'>")
     */
    protected $createdAt;
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助

  • 也许您知道 Symfony Serializer 的解决方案? (3认同)