2015-07-12 102 views
0

我有4个相关的实体。JMS序列化程序,Symfony2,是否可以将几个嵌套实体的JSON序列化为一个对象?

包 - >具有接收器 包 - >具有PackageLines - > PackageLine具有参照StockItem

才有可能序列化此JSON数据。

enter image description here

在除了包含所有其他实体套餐实体?以干净而有效的方式?

我已经做了一些尝试与JMS串行器捆绑没有太多运气。

库存料品是参考库存料品的编号。

/** 
* Package 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\PackageRepository") 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class Package 
{ 

    CONST STATUS_COMPLETED = "COMPLETED"; 
    CONST STATUS_PROCESSING = "PROCESSING"; 
    CONST STATUS_CANCELLED = "CANCELLED"; 
    CONST STATUS_ON_HOLD = "ON_HOLD"; 
    CONST STATUS_FAILED = "FAILED"; 
    CONST STATUS_ERROR = "ERROR"; 


    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Expose 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="IREnterprise\UserBundle\Entity\User", inversedBy="packages") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    **/ 
    private $user; 

    /** 
    * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\Receiver", inversedBy="package", cascade={"all"}) 
    * @Assert\Valid() 
    * @Expose 
    **/ 
    private $receiver; 

    /** 
    * @ORM\OneToMany(targetEntity="IREnterprise\AppBundle\Entity\PackageLine", mappedBy="package", cascade={"all"}) 
    * @Assert\Valid() 
    * @Expose 
    **/ 
    private $packageLines; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="createdAt", type="datetime") 
    * @Expose 
    */ 
    private $createdAt; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="updatedAt", type="datetime") 
    * @Expose 
    */ 
    private $updatedAt; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="shippedAt", type="datetime", nullable=true) 
    * @Expose 
    */ 
    private $shippedAt; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="status", type="string", length=255, nullable=true) 
    * @Expose 
    */ 
    private $status; 

    /** 
    * @var string 
    * @ORM\Column(name="deliveryNote", type="string", length=255, nullable=true) 
    * @Expose 
    */ 
    private $deliveryNote; 


    public function __construct() { 
     $this->setCreatedAt(new \DateTime('now')); 
     $this->setPackageLines(new ArrayCollection()); 

     $this->setStatus(self::STATUS_PROCESSING); 
    } 

    ... getters & setters 
} 

接收机

/** 
* Receiver 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\ReceiverRepository") 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class Receiver 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="IREnterprise\AppBundle\Entity\Package", mappedBy="receiver", cascade={"all"}) 
    **/ 
    private $packages; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Assert\NotBlank() 
    * @Expose 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="company", type="string", length=255, nullable=true) 
    * @Expose 
    */ 
    private $company; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="address1", type="string", length=255) 
    * @Assert\NotBlank() 
    * @Expose 
    */ 
    private $address1; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="address2", type="string", length=255, nullable=true) 
    * @Expose 
    */ 
    private $address2; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="country", type="string", length=255) 
    * @Assert\Country() 
    * @Expose 
    */ 
    private $country; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="zip_code", type="string", length=255) 
    * @Assert\NotBlank() 
    * @Expose 
    */ 
    private $zipCode; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="city", type="string", length=255) 
    * @Assert\NotBlank() 
    * @Expose 
    */ 
    private $city; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="phone", type="string", length=255, nullable=true) 
    * @Expose 
    */ 
    private $phone; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=255, nullable=true) 
    * @Assert\Email() 
    * @Expose 
    */ 
    private $email; 

    public function __construct() { 
     $this->setPackages(new ArrayCollection()); 
    } 
} 

PackageLine

/** 
* PackageLine 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\PackageLineRepository") 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class PackageLine { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\Package", inversedBy="package", cascade={"all"}) 
    * @ORM\JoinColumn(name="package_id", referencedColumnName="id") 
    **/ 
    private $package; 

    /** 
    * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\StockItem", inversedBy="stockitem", cascade={"all"}) 
    * @ORM\JoinColumn(name="stockitem_id", referencedColumnName="id") 
    * @Expose 
    **/ 
    private $stockItem; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="quantity", type="bigint") 
    * @Expose 
    */ 
    private $quantity; 
} 

StockItem

/** 
* StockItem 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\StockItemRepository") 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
* 
*/ 
class StockItem 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Expose 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="IREnterprise\UserBundle\Entity\User", inversedBy="stockItems") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    **/ 
    private $user; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="barcode", type="string", length=255, nullable=true) 
    */ 
    private $barcode; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Expose 
    * @Assert\NotBlank() 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="SKU", type="string", length=255) 
    * @Expose 
    * @Assert\NotBlank() 
    * @Assert\Type(type="digit", message="The value {{ value }} is not a valid {{ type }}.") 
    */ 
    private $SKU; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="stockCount", type="bigint") 
    * @Expose 
    */ 
    private $stockCount = 0; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="orderCount", type="bigint") 
    * @Expose 
    */ 
    private $orderCount = 0; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="createdAt", type="datetime") 
    * @Expose 
    */ 
    private $createdAt; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="updatedAt", type="datetime") 
    * @Expose 
    */ 
    private $updatedAt; 

    public function __construct() { 
     $this->setCreatedAt(new \DateTime('now')); 
    } 
} 

回答

-1

这是非常可能的。见例如

class Package 
    { 
     /** 
     * @Type("string") 
     */ 

     private $id; 

     /** 
     * @Type("ArrayCollection<MyNamespace\Recevier>") 
     */ 
     private $receiver; 
    } 

    class Receiver 
    { 
     /** 
     * @Type("string") 
     */ 

     private $id; 
    } 

输出样本:

{ 
    "package":{ 
     "id":"1", 
     "receiver":{ 
     "id":"1" 
     } 
    } 
} 

请参阅文档 http://jmsyst.com/libs/serializer/master/reference/annotations 我认为这将是对你

+0

非常有帮助的尽管这种联系可以回答这个问题,这是更好在这里包括答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – ElGavilan

+0

感谢您的善意信息。 :) – imran

相关问题