Автоматически установить владельца для объекта - Платформа API - PullRequest
0 голосов
/ 09 октября 2018

Добрый вечер всем, я использую API Platform, и я хотел бы автоматически добавлять владельца к своим сущностям при их создании.Я создал Событие, чтобы переопределить Платформу API, которая берет текущего пользователя и добавляет его.Но мое Событие никогда не выключается, но оно существует в отладке: event-dispatcher

namespace App\EventSubscriber;

use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\MediaObject;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

final class AddOwnerToEntity implements EventSubscriberInterface {
    /**
     * @var TokenStorageInterface
     */
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage) {
        $this->tokenStorage = $tokenStorage;
    }

    public static function getSubscribedEvents() {
        return [
            KernelEvents::VIEW => ['attachOwner', EventPriorities::PRE_WRITE],
        ];
    }

    public function attachOwner(GetResponseForControllerResultEvent $event) {
        $entity = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();

        if (!$entity instanceof MediaObject || Request::METHOD_POST !== $method) {
            // Only handle Article entities (Event is called on any Api entity)
            return;
        }

        // maybe these extra null checks are not even needed
        $token = $this->tokenStorage->getToken();
        if (!$token) {
            return;
        }

        $owner = $token->getUser();
        if (!$owner instanceof User) {
            return;
        }

        $entity->setOwner($owner);
    }
}

Я получаю сообщение об ошибке вставки базы данных, сообщающее, что пользователь имеет значение null.Если в функции attachOwner () я делаю var_dump или выход, ничего не меняется.Есть ли у вас какие-либо идеи?Большое спасибо, Гийом

РЕДАКТИРОВАТЬ Моя загадка, код работает для объектов, управляемых ядром платформы API, но не для системы загрузки, описанной здесь: https://api -platform.com/docs/core/file-upload/#handling-file-upload-1 Было просто необходимо добавить следующую строку:

public function __invoke(Request $request): MediaObject {
    [...]
    $mediaObject->setOwner($this->getUser());

    [...]
}

Если это поможет .... Гийом

1 Ответ

0 голосов
/ 09 октября 2018

Я думаю, что вы забыли сохранить и очистить сущность.Используйте внедрение зависимостей, чтобы вставить EntityManagerInterface $ em и сохранить + очистить сущность в конце метода.

...