Как я могу установить код ответа от DataPersister - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю с Symfony 4.4 / API Platform и пытаюсь вернуть ответ от DataPersister или настроить его код.

В моем DataPersister я проверяю, является ли администратор -> isManager () имеет значение true, поэтому администратор никогда не может быть удален, поэтому в этом случае я хочу вернуть пользовательский код состояния в моем ответе 414 и сообщение «thisAdminIsManager»

AdminDataPersister:

final class AdminDataPersister implements ContextAwareDataPersisterInterface
{
    /* @var EntityManagerInterface */
    private $manager;

    public function __construct(
        EntityManagerInterface $manager
    ){
        $this->manager = $manager;
    }


    public function supports($data, array $context = []): bool
    {
        return $data instanceof Admin;
    }

    public function persist($data, array $context = [])
    {   
        $this->manager->persist($data);
        $this->manager->flush();
    }

    public function remove($data, array $context = [])
    {
        /* @var Admin $data */
        #The Manager can never be deleted:
        if( $data->getManager() ){
            return; //here I want to return the custom response
        }
        $this->manager->remove($data);
        $this->manager->flush();

    }

1 Ответ

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

Вы должны сгенерировать исключение, а затем сконфигурировать вашу api_platform для обработки этого исключения. ApiPlatform преобразует исключение в ответ с сообщением и указанным кодом.

Step1: Создать выделенный класс исключений

<?php
// api/src/Exception/ProductNotFoundException.php

namespace App\Exception;

final class AdminNonDeletableException extends \Exception
{
}

Step2: In ваши данные сохраняются, выведите исключение:

    public function remove($data, array $context = [])
    {
        /* @var Admin $data */
        #The Manager can never be deleted:
        if( $data->getManager() ){
            throw new AdminNonDeletableException('thisAdminIsManager');
        }
        $this->manager->remove($data);
        $this->manager->flush();

    }

Шаг 3: Добавьте свое исключение в файл config / package / api_platform.yaml и объявите кодовый номер (414)

# config/packages/api_platform.yaml
api_platform:
    # ...
    exception_to_status:
        # The 4 following handlers are registered by default, keep those lines to prevent unexpected side effects
        Symfony\Component\Serializer\Exception\ExceptionInterface: 400 # Use a raw status code (recommended)
        ApiPlatform\Core\Exception\InvalidArgumentException: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST
        ApiPlatform\Core\Exception\FilterValidationException: 400
        Doctrine\ORM\OptimisticLockException: 409

        # Custom mapping
        App\Exception\AdminNonDeletableException: 414 # Here is the handler for your custom exception associated to the 414 code

Вы можете найти больше информации в главе обработки ошибок

...