关于资源创建的API平台相关实体

时间:2018-05-08 12:32:19

标签: rest symfony api-platform.com symfony-flex

有没有办法在实体创建资源上传递已创建的相关实体的ID数组?默认文档说明了在post请求中创建所有内容。 一些数据。 我有Squad实体:

/**
 * @ApiResource(iri="http://schema.org/Squad")
 * @ORM\Table(name="squads")
 * @ORM\Entity()
 */
class Squad
{
    use IdentityAutoStrategy, Timestamps;

    /**
     * @var string
     * @ORM\Column(type="string", length=25, unique=true)
     */
    private $name;

    /**
     * @var Collection|User[]|null
     * @ORM\OneToMany(targetEntity="User", mappedBy="squad")
     * @ApiProperty(
     *     attributes={
     *         "swagger_context"={
     *             "$ref"="#/definitions/User",
     *         }
     *     }
     * )
     * @ApiSubresource(max_depth=1)
     */
    private $users;

User实体:

/**
 * @ApiResource()
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="GPL\Repository\UserRepository")
 */
class User implements UserInterface, Serializable
{
    use Timestamps, IdentityAutoStrategy;

    /**
     * @ORM\Column(type="string", length=25, unique=true)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=64)
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=254, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    /**
     * @var Squad
     * @ORM\ManyToOne(targetEntity="Squad", inversedBy="users")
     * @ORM\JoinColumn(name="squad_id", referencedColumnName="id")
     * @ApiProperty(
     *     attributes={
     *         "swagger_context"={
     *             "$ref"="#/definitions/Squad",
     *         }
     *     }
     * )
     */
    private $squad;

我想要实现的主要功能是发送POST /api/squads "users": [1,2,3],其中1,2,3是现有用户的ID,并将它们链接到已创建的Squad实体。这可以使用api-platform的一些默认注释吗?或者我该怎么做?

1 个答案:

答案 0 :(得分:2)

对于JSON-LD,你可以使用这样的IRI:

users: ["users/1", "users/2"]

请注意,如果您在用户资源中禁用GET项目操作,这将无法正常工作。

您还可以强制执行此操作并禁用嵌入数据,以防止客户通过排除所有用户字段组来创建新用户。

/**
 * @ApiResource(attributes={
 * "normalization_context"={"groups"={"squad", "squad:user", "user"}},
 * "denormalization_context"={"groups"={"squad", "squad:user"}}
 * })
 */
class Squad
{

...

/**
 * ...
 * @Groups("squad")
 */
private $name;

/**
 * ...
 * @Groups("squad:user")
 */
private $users;

...
class User
{

 /**
  * ...
  * @Groups("user")
  */
 private $username;
...