лучший способ получить текущий объект перед обновлением - поставить платформу API - PullRequest
0 голосов
/ 03 октября 2019

Я создал операцию put для своего класса Orders. Мне нужно проверить, отменен ли заказ (статус: 5) перед обновлением объекта. Мне нужно получить текущий объект (как он есть в базе данных), чтобы узнать разницу между ними.

public function __invoke(Orders $data): JsonResponse
    {

        return $this->handle($data);
    }

    public function handle(Orders $order){
        $order->setCreatedDate(new \DateTime());
        $em->persist($order);
        $em->flush();
        return new JsonResponse($order);
    }

1 Ответ

0 голосов
/ 03 октября 2019

Вы можете использовать систему событий для этого.

В этом примере я предполагаю, что вы использовали сущность с именем Order

/**
 * @ApiResource
 */
class Order {
    ...
}
<?php

use ApiPlatform\Core\EventListener\EventPriorities;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;


class OrderSubscriber implements EventSubscriberInterface
{
    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::VIEW => [
                ['isOrderCancelled', EventPriorities::PRE_VALIDATE],
            ],
        ];
    }

    public function isOrderCancelled(ViewEvent $event)
    {
        // first check if this affects the requested resource
        $resource = $event->getRequest()->attributes->get('_api_resource_class');

        if (Order::class !== $resource) {
            return;
        }

        // second check if this is the put_item controller
        $controller = $event->getRequest()->attributes->get('_controller');

        if ('api_platform.action.put_item' !== $controller) {
            return;
        }

        // third fetch the object instance
        $order = $event->getControllerResult();

        // you can throw an exception if you order is already cancelled. Or something along those lines
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...