用户关于我在 EasyAdmin 3 和 symfony 5 上的成就的问题

Problem with the user on my achievements on EasyAdmin3 and symfony5

这个问题出现在 Symfony 5 上。我使用 EasyAdmin v3 包创建了我网站的管理端。 当我尝试添加实现时出现问题,它给我以下错误消息。

https://i.stack.imgur.com/RXpLr.png

它说我的用户不能为空,但我担心的是我正在尝试使用管理员帐户添加一个实现,所以我希望他们考虑到我是以管理员身份登录的,并将自己置于从这个帐户实现。下面是我的代码我的实现实体。

<?php

namespace App\Entity;

use App\Repository\RealisationRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
 * @ORM\Entity(repositoryClass=RealisationRepository::class)
 *  @Vich\Uploadable
 */
class Realisation
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nom;

    /**
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $dateRealisation;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\Column(type="boolean")
     */
    private $portfolio;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $slug;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $file;
    /**
     * @var File
     * @Vich\UploadableField(mapping="Realisation",fileNameProperty="file")
     */
    private $imageFile;

    /**
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy="realisations")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\ManyToMany(targetEntity=Categorie::class, inversedBy="realisations")
     */
    private $categorie;

    public function __construct()
    {
        $this->categorie = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->createdAt;
    }

    public function setCreatedAt(\DateTimeInterface $createdAt): self
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    public function getDateRealisation(): ?\DateTimeInterface
    {
        return $this->dateRealisation;
    }

    public function setDateRealisation(?\DateTimeInterface $dateRealisation): self
    {
        $this->dateRealisation = $dateRealisation;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getPortfolio(): ?bool
    {
        return $this->portfolio;
    }

    public function setPortfolio(bool $portfolio): self
    {
        $this->portfolio = $portfolio;

        return $this;
    }

    public function getSlug(): ?string
    {
        return $this->slug;
    }

    public function setSlug(string $slug): self
    {
        $this->slug = $slug;

        return $this;
    }

    public function getFile(): ?string
    {
        return $this->file;
    }

    public function setFile(string $file): self
    {
        $this->file = $file;

        return $this;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): self
    {
        $this->user = $user;

        return $this;
    }

    /**
     * @return Collection|Categorie[]
     */
    public function getCategorie(): Collection
    {
        return $this->categorie;
    }

    public function addCategorie(Categorie $categorie): self
    {
        if (!$this->categorie->contains($categorie)) {
            $this->categorie[] = $categorie;
        }

        return $this;
    }

    public function removeCategorie(Categorie $categorie): self
    {
        $this->categorie->removeElement($categorie);

        return $this;
    }

    /**
     * @return File
     */
    public function getImageFile(): ?File
    {
        return $this->imageFile;
    }

    /**
     * @param File $imageFile
     */
    public function setImageFile(?File $imageFile = null)
    {
        $this->imageFile = $imageFile;
        if(null !== $imageFile){
            $this->dateRealisation = new \DateTime();
        }
    }
}

我的实现CrudController

<?php

namespace App\Controller\Admin;

use App\Entity\Realisation;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Validator\Constraints\DateTime;
use Vich\UploaderBundle\Form\Type\VichFileType;

class RealisationCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Realisation::class;

    }

    public function configureFields(string $pageName): iterable
    {

        return [
            IntegerField::new('id','ID')->onlyOnIndex(),
            TextField::new('nom'),
            TextEditorField::new('description'),
            DateTimeField::new('createdAt'),
            DateTimeField::new('dateRealisation'),
            TextField::new('slug'),
           BooleanField::new('portfolio'),
            TextareaField ::new('imageFile')
                ->setFormType(VichFileType::class)
                ->setLabel('Image'),


        ];
    }
}

您希望 用户 始终是创建您的 Realisation 实体时登录的用户吗?

实现此目的的一种简单方法是使用事件自动将用户设置为您的登录用户。

一个示例是使用 EventSubscriber:

class DoctrineSubscriber implements EventSubscriber

    private $tokenStorage;

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

    public function getSubscribedEvents(): array
    {
        return [
            Events::prePersist => 'prePersist',
        ];
    }

    public function prePersist(OnFlushEventArgs $args)
    {
       $entity = $args->getObject();

        if ($entity instanceof Realisation) {
            $user = $this->tokenStorage->getToken()->getUser();
            if($user){
                $entity->setUser($user);
            }else{
                //throw an exception, no user logged in
            }
            
        }
    }

}

并且不要忘记在 services.yaml

中定义您的事件订阅者
  #services.yaml
  App\EventSubscriber\DoctrineSubscriber:
    tags:
      - { name: doctrine.event_subscriber }

另一种方法是从 EasyAdmin AbstractCrudController 覆盖 createEntity 方法:

public function createEntity(string $entityFqcn)
{
    $realisation = new Realisation();
    
    $realisation->setUser($this->getUser());

    return $realisation;
}