2012-09-13 40 views
48

phép nói rằng tôi muốn tạo một XML-phản ứng rằng sẽ trông giống như sau:Làm thế nào để tạo ra một định dạng hypermedia tốt bằng cách sử dụng JMSSerializerBundle?

<?xml version="1.0" encoding="utf‐8"?> 
<product xmlns="urn:com.acme.prods" xmlns:atom="http://www.w3.org/2005/xlink"> 
    <id>1234</id> 
    <name>Red Stapler</name> 
    <price currency="EUR">3.14</price> 
    <atom:link rel="payment" type="application/com.acme.shop+xml" 
      href="http://acme.com/products/1234/payment" /> 
</product> 

Với một mô hình miền đó trông giống như sau:

<?php 
// Product.php 
namespace Acme\Bundle\ProductBundle\Entity; 
use Acme\Bundle\ProductBundle\Money\Money; 

class Product 
{ 
    /** 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @var string 
    */ 
    private $name; 

    /** 
    * @var Money 
    */ 
    private $price; 

    [..] 
} 

Và một tiền-class dọc theo các dòng:

<?php 
// Money.php 
namespace Acme\Bundle\ProductBundle\Money; 

class Money 
{ 
    /** 
    * @var string 
    */ 
    private $currency; 
    /** 
    * 
    */ 
    private $amount; 
} 

Bây giờ, cho câu hỏi của tôi. Sẽ khá đơn giản khi tạo phản hồi giống như sau

<?xml version="1.0" encoding="utf‐8"?> 
<product> 
    <id>1234</id> 
    <name>Red Stapler</name> 
    <price currency="EUR">3.14</price> 
</product> 

sử dụng chú thích, XML hoặc YAML để thông báo cho JMSSerializerBundle cách sắp xếp hàng hóa đối tượng Sản phẩm. Tuy nhiên, các mục nhập xmlns:atom<atom:link> không được chỉ định bởi pháp nhân vì nó không có khái niệm về cáchnơi đặt số. Bạn cũng có thể tưởng tượng nhiều liên kết hơn với các thuộc tính khác nhau, chẳng hạn như edit.
Một giải pháp xuất hiện trong tâm trí sẽ là dịch vụ lắng nghe sự kiện tuần tự hóa cho các đối tượng cụ thể và thêm các thuộc tính và thẻ này cho phù hợp. Dịch vụ có thể sử dụng DI để giữ các dịch vụ Request, Router-dịch vụ vv để tạo các liên kết này ở định dạng phù hợp với định dạng được yêu cầu. IE trong một XML-Đáp lại, nó có thể thiết lập các loại thích hợp để application/media-format+xml, trong khi ở một json-Đáp lại, nó có thể tạo ra một cái gì đó giống như

"links": [ 
    { 
    "rel": "payment", 
    "type": "application/media-format+json", 
    "href": "[...]" 
    } 
] 

Bây giờ, trong the documentation for JMSSerializerBundle, tôi thấy chú thích cho @PreSerialize, và @PostSerialize, nhưng họ dường như chỉ có thể gọi các phương thức trên đối tượng đang được tuần tự hóa.
Có ai biết làm thế nào/nếu điều này có thể đạt được? Hoặc tôi có phải sử dụng một công cụ tạo khuôn mẫu như Twig và tạo thủ công phản hồi XML không?

+0

Câu hỏi rất thú vị. Sau khi poking một chút xung quanh, tôi điều không có giải pháp khác sau đó gây ô nhiễm thực thể của bạn với các thuộc tính bổ sung được sử dụng chỉ cho serialization ... Những gì dường như bị mất trong gói là một khả năng xử lý serialization hoàn thành của một đối tượng cụ thể với lớp học. – room13

+0

[Bạn có thể kiểm tra ở đây 1: xác định nhóm mỗi thuộc tính] [1] [Cũng đây 2: jms serializer bó phức tạp tạo ra giá trị] [2] [ 1]: http://stackoverflow.com/questions/13665369/jmsserializerbundle-specify-group-per-attribute [2]: http://stackoverflow.com/questions/14475171/jmsserializerbundle-complex-generated-value –

Trả lời

3

Gói bộ nối tiếp một mình có thể không đủ cho trường hợp này vì nó chỉ liên quan đến tuần tự hóa và deserialization, không phức tạp hơn nhiệm vụ ngữ nghĩa.

Tôi khuyên bạn nên xem xét FSCHateoasBundle để triển khai định dạng siêu văn bản cho API của bạn.

Các vấn đề liên quan