如何在 Symfony 2 的序列化器配置中公开相关对象的属性?

Ild*_*dar 3 symfony fosrestbundle

我在 Web 服务中将 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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是我的角色实体。它具有属性: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
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是我的序列化器配置文件:

AppBundle\Entity\Role:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
            type: integer
            xml_attribute: true
        name:
            expose: true
            type: string
Run Code Online (Sandbox Code Playgroud)

现在,动作控制器中的 getRolesAction 将输出带有 id 和 name 属性的 JSON。如何将parent_id属性添加到序列化器输出中?

LBA*_*LBA 5

你可以使用类似的东西:

/**
 * @Serializer\VirtualProperty
 * @Serializer\Type("integer")
 * @Serializer\SerializedName("parent_id")
 *
 * @return integer
 */
public function getParentId()
{
    return $this->parent->getId();
}
Run Code Online (Sandbox Code Playgroud)

我无法告诉您如何以配置(可能是 YAML)格式传输注释,但您可以做到这一点。

重要的

这仅适用于序列化 - 所以不要指望此属性稍后会被反序列化!

选择

如果您只想达到您所要求的结果,您可以将其添加到您的属性中:

/** 
 * @Accessor(getter="getParentId",setter="setParent") */
 * @Serializer\Type("integer")
 * @Serializer\SerializedName("parent_id")
 */
private $parent;
Run Code Online (Sandbox Code Playgroud)

另外还有另一个吸气剂:

/**
 *
 * @return integer
 */
public function getParentId()
{
    return $this->parent->getId();
}
Run Code Online (Sandbox Code Playgroud)

使用访问器,您可以告诉 JMS 从哪个 getter 获取要序列化的结果,同时仍然能够使用 setter 进行反序列化。