Symfony doctrine не выполняет вставку / обновление / удаление - PullRequest
0 голосов
/ 05 января 2020

Я работал над проектом symfony в прошлом месяце, я мог CRUD-данные со своими объектами. Но сейчас я не могу вставить, обновить или удалить данные. Я могу только читать данные, все нормально читать.

Когда я отправляю форму, ошибка не отображается.

Я пытался отправить форму для создания идеи. Идея не создана. Но когда я пытался вернуть данные json при отправке формы, дата была хорошей, но в моей базе данных изменений не было.

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

Кто-нибудь знает почему?

Пример маршрута:

    /**
     * @Route("/{projet}/{id_projet}/idee/nouvelle",name="projet_idee_nouvelle")
     */
    public function projet_idee_nouvelle(int $id_projet,Request $request, ObjectManager $manager){
        $idee=new Idee();

        $repository = $this
        ->getDoctrine()
        ->getManager()
        ->getRepository('App:Projet')
        ;
        $projet=$repository->find($id_projet);

        $projets=array();
        array_push($projets,$projet);

        $form=$this->createForm(IdeeType::class,$idee, array(
            'projets'=>$projets
        ));

        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $manager->persist($idee);
            $manager->flush();

            //redirection on the created project
            return $this->redirectToRoute('projet_detail',array('id'=>$projet->getId()));
        }

        return $this->render('idee/idee_nouveau.html.twig',[
            'form'=>$form->createView()
        ]);
    }

Моя сущность "Projet":

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProjetRepository")
 */
class Projet
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    //{...} Other class attributes

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Idee", mappedBy="projet", cascade={"all"}, orphanRemoval=true)
     */
    private $projetIdee;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Tache", mappedBy="projet", cascade={"all"}, orphanRemoval=true)
     */
    private $projetTache;
}

Моя сущность Idee:

/**
 * @ORM\Entity(repositoryClass="App\Repository\IdeeRepository")
 */
class Idee
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Projet")
     * @ORM\JoinColumn(nullable=false)
     */
    private $projet;

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

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank
     */
    private $texte;
}

Моя веточка для добавления идеи:

{% extends 'base.html.twig' %}

{% block title %}Ajouter une idée{% endblock %}

{% block main %}
    <h1>Ajouter une idée au projet</h1>

    {{ form_start(form) }}
        {{ form_row(form.projet, {'label':'Projet associé'})}}
        {{ form_row(form.label, {'label':'Label de l\'idée','attr':{'placeholder':'Label de l\'idée'}}) }}
        {{ form_row(form.texte, {'label':'Description','attr':{'placeholder':'Description'}}) }}
        <button class="button_form" type="submit">Ajouter l'idée</button>
    {{ form_end(form) }}
{% endblock %}

My IdeeType:

<?php

namespace App\Form;

use App\Entity\Idee;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;

class IdeeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('projet',ChoiceType::class,array(
                'label'=>'Projet associé',
                'choices'=>$options['projets'],
                'choice_label' => 'nom',
                'required'=>true
            ))
            ->add('label',TextType::class,array(
                'required'=>true
            ))
            ->add('texte',TextareaType::class,array(
                'required'=>true
            ))
        ;
    }

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

1 Ответ

0 голосов
/ 05 января 2020

Я буду тупым об этом, но то, как вы кодируете с помощью Symfony 4, совершенно неверно ...
Вы бы лучше всего сформировали себя на Symfony 4 как можно скорее.
Вы только закончите -при проблемах, если вы продолжаете в том же духе.

С автопроводкой, которая включена по умолчанию в Symfony 4, вы можете передавать почти все в качестве параметра для вашей функции (контроллеры, репозитории и т. д. c) ).

Здесь я изменил параметры вашей функции. Удалено ObjectManager, поскольку оно уже является частью расширенного AbstractController, добавлено ProjetRepository и Projet.

Настоятельно рекомендуется всегда устанавливать action для вашей формы. 'method' - это просто бонус.

Я также разделил isSubmitted() и isValid(), что позволит вам вернуть пользовательский ответ в случае неверной отправленной формы.

Вот как ваш код должен выглядеть следующим образом:

use App\Entity\Idee;
use App\Entity\Projet;
use App\Form\IdeeType;
use App\Repository\ProjetRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class IdeeController extends AbstractController {
    /**
     * @Route("/{nom}/{id}/idee/nouvelle",name="projet_idee_nouvelle", methods={"GET", "POST"})
     * @param Request $request
     * @param ProjetRepository $projetRepository
     * @param Projet $projet
     * @return RedirectResponse|Response
     */
    public function nouvelleIdee(Request $request, ProjetRepository $projetRepository, Projet $projet) {
        $idee=new Idee();
        $projets=array();
        array_push($projets, $projet);

        $form=$this->createForm(IdeeType::class, $idee, array(
            'action'=>$this->generateUrl('projet_idee_nouvelle', array('id'=>$projet->getId())),
            'method'=>'POST',
            'projets'=>$projets,
        ));

        $form->handleRequest($request);
        if($form->isSubmitted()) {
            if($form->isValid()) {
                $em=$this->getDoctrine()->getManager();
                $em->persist($idee);
                $em->flush();

                //redirection on the created project
                return $this->redirectToRoute('projet_detail', array('id'=>$projet->getId()));
            } else {
                //ToDo Return 404 or error message, etc...
            }
        }

        return $this->render('idee/idee_nouveau.html.twig', array(
            'idee'=>$idee,
            'projet'=>$projet,
            'form'=>$form->createView(),
        ));
    }
}

В вашей ветке ваша ссылка на страницу должна выглядеть следующим образом:

<a href="{{ path('projet_idee_nouvelle', { 'nom': projet.nom, 'id': projet.id }) }}">Ajouter une idée</a>

В случае, если вы хотите сохранить параметры URL таким образом, чтобы вы можете понять их, вы бы изменили это:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/{projet_nom}/{projet_id}/idee/nouvelle",name="projet_idee_nouvelle", methods={"GET", "POST"})
 * @ParamConverter("projet", options={"mapping": {"nom", "projet_nom", "id": "projet_id"}})
 */

<a href="{{ path('projet_idee_nouvelle', { 'projet_nom': projet.nom, 'projet_id': projet.id }) }}">Ajouter une idée</a>
...