大家晚上好, 我使用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());
[...]
}
如果有帮助... 纪尧姆
答案 0 :(得分:0)
我认为您忘记了保留并刷新实体。使用依赖项注入来插入EntityManagerInterface $ em并在方法末尾持久性刷新实体。