Избегайте извлечения всех сущностей во время handleRequest в Symfony 4

Я создал форму для редактирования только двух свойств объекта, у которого есть четыре, два из которых являются связями со многими другими объектами.

Я использую форму для изменения двух строковых данных.

Когда handleRequest запускается после отправки формы в моем контроллере, моя страница загружается медленно и занимает много памяти. После поиска это связано с тем, что handleRequest извлекает содержимое всех свойств измененного объекта для проверки.

Можно ли изменить определенные свойства объекта, не обрабатывая HandRequest все данные объекта?

Позвольте мне привести пример моих файлов:

/**
 * @ORMEntity(repositoryClass="AppRepositoryTracteurRepository")
 */
class Tracteur
{
    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=30)
     * @AssertNotBlank()
     * @AssertLength(max=30)
     * @AssertType("string")
     */
    private $nom;

    /**
     * @ORMColumn(type="string", length=10)
     * @AssertNotBlank()
     * @AssertLength(max=10)
     * @AssertType("string")
     */
    private $tag;

    /**
     * @ORMOneToMany(targetEntity="AppEntityAlerteTracteur", mappedBy="tracteur", orphanRemoval=true)
     */
    private $alertes;

    /**
     * @ORMOneToMany(targetEntity="AppEntityPoslog", mappedBy="tracteur")
     */
    private $poslogs;

    public function __construct()
    {
        $this->alertes = new ArrayCollection();
        $this->poslogs = 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 getTag(): ?string
    {
        return $this->tag;
    }

    public function setTag(?string $tag): self
    {
        $this->tag = $tag;

        return $this;
    }

    /**
     * @return Collection|AlerteTracteur[]
     */
    public function getAlertes(): Collection
    {
        return $this->alertes;
    }

    public function addAlerte(AlerteTracteur $alerte): self
    {
        if (!$this->alertes->contains($alerte)) {
            $this->alertes[] = $alerte;
            $alerte->setTracteur($this);
        }

        return $this;
    }

    public function removeAlerte(AlerteTracteur $alerte): self
    {
        if ($this->alertes->contains($alerte)) {
            $this->alertes->removeElement($alerte);
            // set the owning side to null (unless already changed)
            if ($alerte->getTracteur() === $this) {
                $alerte->setTracteur(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Poslog[]
     */
    public function getPoslogs(?RechercheInformations $recherche): Collection
    {
        $poslogs = $this->poslogs;

        if(!empty($recherche)){
            $criteria = Criteria::create()
                ->andWhere(Criteria::expr()->andX(
                    Criteria::expr()->lte('dateCreation', $recherche->getDateFin()),
                    Criteria::expr()->gte('dateCreation', $recherche->getDateDebut())
                ))
            ;

            $poslogs = $poslogs->matching($criteria);
        }

        return $poslogs;
    }

    public function addPoslog(Poslog $poslog): self
    {
        if (!$this->poslogs->contains($poslog)) {
            $this->poslogs[] = $poslog;
            $poslog->setTracteur($this);
        }

        return $this;
    }

    public function removePoslog(Poslog $poslog): self
    {
        if ($this->poslogs->contains($poslog)) {
            $this->poslogs->removeElement($poslog);
            // set the owning side to null (unless already changed)
            if ($poslog->getTracteur() === $this) {
                $poslog->setTracteur(null);
            }
        }

        return $this;
    }
}

Моя форма:

class TracteurType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom', TextType::class, [
                "required" => true,
            ])
            ->add('tag', TextType::class, [
                "required" => true,
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Tracteur::class,
        ]);
    }
}

Мой контроллер:

    /**
     * @Route("/parametrage/tracteur/{id}/editer", name="tracteur_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, int $id): Response
    {
        $tracteur = $this->em->getRepository(Tracteur::class)->findTracteur($id);

        $form = $this->createForm(TracteurType::class, $tracteur);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->em->persist($tracteur);
            $this->em->flush();
        }

        return $this->render('tracteur/edit.html.twig', [
            'page' => 'tracteurs',
            'tracteur' => $tracteur,
            'form' => $form->createView(),
        ]);
    }

Всего 1 ответ


Помещение доктрины fetch = "EXTRA_LAZY" или fetch = "LAZY" на отображение должно помочь


Есть идеи?

10000