我在我的网络服务中使用FOSRestBundle和JMSSerializerBundle。 这是我的动作控制器中的一个函数,它返回一个角色列表。我不知道如何返回" parent_id"此列表中的字段。
<?php
use FOS\RestBundle\Controller\FOSRestController;
class RoleController extends FOSRestController
{
...
/**
* List all roles.
*
* @Annotations\View()
*
* @return array
*/
public function getRolesAction()
{
$roles = $this->repository->findRoles();
$view = $this->view($roles, 200);
return $this->handleView($view);
}
...
}
这是我的角色实体。它具有属性:id,name和parent。父母是一个角色。
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Role
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\RoleRepository")
*/
class Role
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Role")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
private $parent;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
// + getters and setters
...
}
这是我的序列化程序配置文件:
AppBundle\Entity\Role:
exclusion_policy: ALL
properties:
id:
expose: true
type: integer
xml_attribute: true
name:
expose: true
type: string
现在,动作控制器中的getRolesAction将输出具有id和name属性的JSON。如何将parent_id属性添加到序列化程序输出?
答案 0 :(得分:4)
您可以使用以下内容:
/**
* @Serializer\VirtualProperty
* @Serializer\Type("integer")
* @Serializer\SerializedName("parent_id")
*
* @return integer
*/
public function getParentId()
{
return $this->parent->getId();
}
我无法告诉您如何在配置(可能是YAML)格式中传输注释,但您可以做到这一点。
重要
这仅适用于序列化 - 所以不要期望以后反序列化此属性!!
<强>替代强>:
如果您只想达到要求的结果,可以将其添加到您的属性中:
/**
* @Accessor(getter="getParentId",setter="setParent") */
* @Serializer\Type("integer")
* @Serializer\SerializedName("parent_id")
*/
private $parent;
另外还有另一个吸气剂:
/**
*
* @return integer
*/
public function getParentId()
{
return $this->parent->getId();
}
使用访问器,您告诉JMS从哪个getter获取结果以进行序列化,同时仍然可以使用setter进行反序列化。