Исключить свойство объекта из операции сбора платформы API - PullRequest
0 голосов
/ 11 апреля 2020

Я изучаю платформу API Symfony. Я хочу скрыть некоторые свойства сущности товара при получении списка товаров. Я использовал тестовый нормализатор, но мой код продолжает игнорировать меня. Нормализатор не вызывается, все данные поступают напрямую в вывод. Пожалуйста, помогите.

products.php

namespace App\Entity;

 /**
 * @ORM\Table(schema="new_api", name="products")
 * @ORM\Entity(repositoryClass="App\Repository\ProductsRepository")
 * @UniqueEntity("productName", message="The product name must be unique")
 * @ApiResource(
 *     normalizationContext={"groups"={"get-product", "get-products"}},
 *     denormalizationContext={"groups"={"user", "user:write"}},
 *     collectionOperations={
 *         "get"={"security"="is_granted('ROLE_PRODUCTS')", },
 *         "post"={"security"="is_granted('ROLE_PRODUCTS_ADD')"}
 *     },
 *     itemOperations={
 *         "get"={"security"="is_granted('ROLE_PRODUCTS')"},
 *         "put"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *         "patch"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *         "delete"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *     },
 * )
 */

class Products
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     * @Groups({"get-product", "get-products"})
     */
    private $id;

    /**
     * @Groups({"get-product", "get-products"})
     * @SerializedName("name")
     * @ORM\Column(name="product_name", type="string", length=255, unique=true)
     * @Assert\NotBlank(message="The product name cannot be empty")
     */
    private $productName;

    /**
     * @Groups({"get-product"})
     * @ORM\Column(name="description", type="text", length=65535, nullable=false)
     */
    private $description;

}


services.yaml

    'App\Serializer\ProductsNormalizer':
            arguments: [ '@api_platform.serializer.normalizer.item' ]
            tags: [ 'serializer.normalizer' ]
            autoconfigure: false

1 Ответ

1 голос
/ 11 апреля 2020

Использование нормализатора не требуется.

Вы уже определили группы сериализации для свойств (get-product и get-products,).

Теперь вам просто нужно объявить они используются для каждой операции. Или определите контекст нормализации по умолчанию для ресурса и просто переопределите его для операции, которая должна использовать другую группу сериализации.

Например:

/**
 * @ApiResource(
 *     normalizationContext={"groups"={"get-product"}},
 *     denormalizationContext={"groups"={"user", "user:write"}},
 *     collectionOperations={
 *         "get"={
 *               "security"="is_granted('ROLE_PRODUCTS')",
 *               "normalization_context"={"groups"={"get-products"}}
 *         },
 *         "post"={"security"="is_granted('ROLE_PRODUCTS_ADD')"}
 *     },
 *     itemOperations={
 *         "get"={"security"="is_granted('ROLE_PRODUCTS')"},
 *         "put"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *         "patch"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *         "delete"={"security"="is_granted('ROLE_PRODUCTS_EDIT')"},
 *     },
 * )
 */

С помощью вышеизложенного вы по умолчанию используется группа сериализации get-product для ответов, за исключением операции сбора GET, которая использует группу сериализации get-products.

(я обычно не пишу свою конфигурацию с помощью аннотаций, поэтому надеюсь, я не представил никакой неожиданной ошибки, но даже если есть ошибочная опечатка, это может поспорить, что вы идете.)

...