2016-12-14 8 views
1

Моя composer.json (часть):Symfony 3 FOS Rest + JMS Serializer группы

{ 
    "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 Context, а не 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^