自动将所有者设置为实体-API平台

时间:2018-10-09 15:29:05

标签: symfony events api-platform.com

大家晚上好, 我使用API​​平台,我想在创建实体时将所有者自动添加到我的实体中。 我创建了一个事件,以覆盖API平台,该事件接收当前用户并将其添加。 但是我的事件永远不会结束,但是它确实存在于debug: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);
    }
}

我收到数据库插入错误,告诉我用户为空。如果在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 :(得分:0)

我认为您忘记了保留并刷新实体。使用依赖项注入来插入EntityManagerInterface $ em并在方法末尾持久性刷新实体。