2016-12-14 22 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; 
}