2016-12-14 56 views
1

composer.json(一部分):Symfony的3 FOS休息+ JMS串行組

{ 
    "require": { 
     "symfony/symfony": "3.1.*", 
     "jms/serializer-bundle": "^1.1", 
     "friendsofsymfony/rest-bundle": "^2.1" 
    } 
} 

我有一些實體,我想爲列表動作和完整的查找操作返回的部分數據。那麼,我有這些文件:

Product.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation as JMS; 

/** 
* @ORM\Entity 
* @ORM\Table(name="represented") 
* @JMS\ExclusionPolicy("ALL") 
*/ 
class Product 
{ 
    /** 
    * @var integer 
    * @ORM\Column(type="integer", nullable=false, options={"unsigned"=true}) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(type="string", nullable=false, length=48) 
    */ 
    protected $name; 

    /** 
    * @var Group 
    * @ORM\ManyToOne(targetEntity="Group", inversedBy="products") 
    * @ORM\JoinColumn(name="group_id", referencedColumnName="id") 
    */ 
    protected $group; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setGroup(Group $group) 
    { 
     $this->group = $group; 
    } 

    public function getGroup() 
    { 
     return $this->group; 
    } 
} 

ProductController.php

<?php 

namespace AppBundle\Controller; 

use FOS\RestBundle\Controller\Annotations\Get; 
use FOS\RestBundle\Controller\FOSRestController; 
use AppBundle\Entity\Product; 

class ProductController extends FOSRestController 
{ 
    /** 
    * @Get("/product", name="list_products") 
    */ 
    public function listAction() 
    { 
     $products = $this->getDoctrine() 
      ->getRepository('AppBundle:Product') 
      ->findBy([], [ 'name' => 'ASC' ]); 

     $view = $this->view($products); 

     return $this->handleView($view); 
    } 

    /** 
    * @Get("/product/{id}", requirements={"id" = "\d+"}, name="get_product") 
    */ 
    public function getAction($id) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $product = $em->getRepository('AppBundle:Product') 
      ->find($id); 

     if (! $product) { 
      $error = [ 
       'error' => 'Product not found' 
      ]; 

      $view = $this->view($error, 404); 
     } else { 
      $view = $this->view($product); 
     } 

     return $this->handleView($view); 
    } 
} 

我希望能夠不顯示在列表結果group財產。爲此,我嘗試了一些方法,主要是與團隊合作。

  1. 只需使用我想告訴我的名單與Groups({"List"})上 並參考該組的 控制器與@View(serializerGroups={"List"})屬性來配置的組名。但是這並沒有 的影響,因爲所有的屬性都是可見的。
  2. 配置@ExclusionPolicy("all")爲整個實體沒有 工作以及。
  3. 除了ExclusionPolicy,@Expose所有屬性我想要 要顯示在一些或所有組,但使所有屬性標記爲 顯示。

我也嘗試了一些這些變體,但沒有改變結果。

回答

1

控制器的作用到底應不應該只是:

return $this->handleView($view); 

但對於得到一個或多個組的工作,你需要激活它們。在類的頂部,你需要添加FOSRest上下文,不JMS背景:

use FOS\RestBundle\Context\Context; 

,並在返回查看之前的控制器操作:

$view = $this->view($products, 200); 
$context = new Context(); 
$context->setGroups(['list']); 
$view->setContext($context); 

return $this->handleView($view); 

這將爲Symfony的3.2工作,並FOSRest 2.1和2.0 。

鏈接進行升級文檔FOSRest: https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/UPGRADING-2.0.md

0

如果使用@Exclude那麼這應該工作。我用另一種方法是,使一個小除了config.yml

fos_rest: 
    serializer: 
     groups: ['Default'] 

這需要實體屬性是該組中Default才能被序列化。如果您的房產沒有@Groups註釋,那麼它將在Default中,但只要您添加@Groups註釋,那麼它將不再位於Default組中(除非您專門添加它)。)

這使默認的序列化過程,包括除了那些與@Groups註釋的所有實體字段,然後在其他地方我可以同時選擇Default和我的其他組序列化,如果我想一切都被包括在內。

// Function in the Controller class 
public function getAction(MyEntity $me) { 
    // Use automatic serializer, only things in 'Default' group are included 
    return $me; 
}