gpt4 book ai didi

Symfony2、FOSRestBundle。如何将组与 JMSSerializerBundle 一起使用?

转载 作者:行者123 更新时间:2023-12-01 18:48:28 25 4
gpt4 key购买 nike

我有实体:

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
//...


/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
**/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Groups({"default"})
*/
protected $id;

/**
* @ORM\ManyToMany(targetEntity="StorageBundle\Entity\File")
* @ORM\JoinTable(name="users_photos",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="photo_id", referencedColumnName="id", onDelete="CASCADE")}
* )
* @Groups({"default"})
*/
protected $photoFiles;

/**
* @ORM\Column(type="string", length=255, nullable=true, unique=false)
* @Groups({"notification"})
*/
protected $deviceId;

/**
* @ORM\Column(type="string", length=255, nullable=true, unique=false)
* @Groups({"default"})
*/
protected $name;

/**
* @ORM\OneToOne(targetEntity="AppBundle\Entity\Car", mappedBy="driver")
* @Groups({"driver"})
*/
private $car;

/**
* @var \DateTime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
* @Groups({"default"})
*/
protected $created;

/**
* @var \DateTime $updated
*
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
* @Groups({"default"})
*/
protected $updated;


}

我的 Controller :

<?php
namespace AppBundle\Controller;

use AppBundle\Entity\User;
//...

class UsersController extends AppController{

/**
* Get list of Admins
* @Annotations\Get("/api/v1/admins", name="list_of_admins")
* @return \FOS\RestBundle\View\View
*/
public function getAdminsAction(){

if(!$this->isGranted('ROLE_ADMIN')){
throw new AccessDeniedException('Only for Admin');
}

$admins = $this->getDoctrine()->getRepository('AppBundle:User')->findByRole('ROLE_ADMIN');

return $this->view(['data' => $admins], Codes::HTTP_OK);

}

}

具有 ROLE_ADMIN 角色的用户没有汽车(汽车只有具有 ROLE_DRIVER 角色的用户)。当我尝试获取所有管理员时,我得到以下信息:

{
"id": 4,
"username": "admin@site.com",
"email": "admin@site.com",
"roles": [
"ROLE_ADMIN"
],
"photoFiles": [],
"name": "Andrii",
"car": null
}

我尝试添加群组。我需要添加 Controller 以仅接收来自组默认通知的数据

最佳答案

提醒一下,JMSSerializer 中的Groups 用作排除策略。

排除策略由用于根据条件/上下文公开/排除属性的特定方法组成。

为了正确使用它们,您要做的第一件事就是排除实体的所有属性:

// ...
use JMS\Serializer\Annotation as JMS;

/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @JMS\ExclusionPolicy("all")
*/
class User extends BaseUser

现在,您已根据显式公开属性:

/**
* @ORM\Column(type="string", length=255, nullable=true, unique=false)
* @JMS\Groups({"default"}) // Idem for all properties you want render in group "default"
*/
protected $name;

/**
* @ORM\Column(type="string", length=255, nullable=true, unique=false)
* @JMS\Groups({"notification"})
*/
protected $deviceId;

然后,您必须在 Controller 操作中定义使用的Group:

/**
* Get list of Admins
* @Annotations\Get("/api/v1/admins", name="list_of_admins")
* @Annotations\View(serializerGroups={"default", "notification"}) // Here set the Group used
* @return \FOS\RestBundle\View\View
*/
public function getAdminsAction()
{
if(!$this->isGranted('ROLE_ADMIN')){
throw new AccessDeniedException('Only for Admin');
}

$admins = $this->getDoctrine()->getRepository('AppBundle:User')->findByRole('ROLE_ADMIN');

return $this->view(['data' => $admins], Codes::HTTP_OK);
}

现在,$admins 仅包含向组defaultnotification 公开的属性。

您也可以手动执行此操作,而不是使用注释:

$view = $this->view($admins, 200);
$view->setSerializerGroups(array('default', 'notification'));

return $this->handleView($view);

有关更多信息,请参阅Exclusion strategies .

希望您能清楚地了解。

关于Symfony2、FOSRestBundle。如何将组与 JMSSerializerBundle 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com