Как скрыть свойство сущности в Symfony4 api-платформа

#php #api #symfony #api-platform.com

#php #API #symfony #api-platform.com

Вопрос:

У меня есть этот объект

 /**
* @ApiResource(
*       collectionOperations={
*           "get"={
*               "access_control"="is_granted('IS_AUTHENTICATED_FULLY')"
*           },
*           "post"={
*               "access_control"="is_granted('IS_AUTHENTICATED_FULLY')"
*           }
*       },
*       itemOperations={
*       "get"={
*               "access_control"="is_granted('ROLE_ADMIN') or object.getUser() == user"
*           },
*           "put"={
*               "access_control"="is_granted('ROLE_ADMIN') or object.getUser() == user"
*          },
*           "delete"={
*               "access_control"="is_granted('ROLE_ADMIN') or object.getUser() == user"
*          }
*       }
* )
* @ORMEntity(repositoryClass="AppRepositoryFeedRepository")
*/
class Feed implements AuthoredEntityInterface
{
/**
 * @ORMId()
 * @ORMGeneratedValue()
 * @ORMColumn(type="integer")
 */
private $id;

/**
 * @ORMManyToOne(targetEntity="AppEntityUser", inversedBy="feeds")
 * @ORMJoinColumn(nullable=false)
 */
private $user;

/**
 * @ORMColumn(type="string", length=255)
 */
private $name;

/**
 * @ORMColumn(type="string", length=2083, unique=true)
 */
private $url;

//various getters and setters

}
  

Связанная пользовательская сущность реализует интерфейс пользователя. Этот объект реализует интерфейс, который я использую для автоматического заполнения поля пользователя зарегистрированным пользователем.

Автоматически сгенерированная конечная точка /api/feeds POST ожидает 3 параметра: пользователь, имя и URL.

Я хочу исключить параметр user из конечной точки (потому что автоматически генерируется внутри). Я знаю, что мог бы просто не использовать его, но это вызывает проблемы при тестировании, когда я получаю это сообщение:

Предоставлено недопустимое значение (недопустимый IRI?)

Спасибо

Ответ №1:

Symfony Serializer поддерживает @Groups аннотацию, которая позволяет скрывать или показывать поля на основе заданной группы.

В документах API Platform есть пример https://api-platform.com/docs/core/serialization/#using-serialization-groups

 /**
 * @ApiResource(
 *     normalizationContext={"groups"={"read"}},
 *     denormalizationContext={"groups"={"write"}}
 * )
 */
class Book
{
    /**
     * @Groups({"read", "write"})
     */
    public $name;

    /**
     * @Groups("write")
     */
    public $author;

    // ...
}