2015-07-12 1 views
0

J'ai 4 entités qui sont liées.JMS Serializer, Symfony2, est-il possible de sérialiser le JSON de plusieurs entités imbriquées en un seul objet?

Package -> a un récepteur Package -> a PackageLines -> PackageLine a référence à un stockArticle

Serait-il possible de sérialisation ces données JSON.

enter image description here

pour une entité de package qui contient toutes les autres entités? D'une manière propre et efficace?

J'ai fait quelques tentatives avec le bundle de sérialiseur JMS sans trop de chance.

L'article en stock est l'identifiant de l'article en stock de référence.

paquet

/** 
* 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 
} 

Récepteur

/** 
* 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; 
} 

stockArticle

/** 
* 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')); 
    } 
} 

Répondre

-1

C'est très possible. voir l'exemple

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

     private $id; 

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

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

     private $id; 
    } 
sortie

exemple:

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

S'il vous plaît voir le doc http://jmsyst.com/libs/serializer/master/reference/annotations Je pense que ce sera très utile pour vous

+0

Bien que ce lien peut répondre à la question, il vaut mieux pour inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – ElGavilan

+0

Merci pour votre aimable information. :) – imran