Symfony原则未执行插入/更新/删除

问题描述 投票:0回答:1

我上个月正在从事一个symfony项目,我可以与我的实体进行CRUD数据。但是现在,我无法插入,更新或删除数据。我只能读取数据,一切都可以读取。

提交表单时,不会显示任何错误。

我试图提交一个表格来创建一个主意。没有创建任何想法。但是,当我提交表单时尝试返回数据json时,日期很好,但是数据库中没有任何更改。

我不知道自从遇到这个问题后,所有这些表格都在几周前生效了。

有人知道为什么吗?

路线示例:

    /**
     * @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 %}

我的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
        ]);
    }
}
symfony doctrine crud
1个回答
0
投票

我会对此直言不讳,但是用Symfony 4编码的方式是完全错误的...您最好尽早在Symfony 4上组建自己。如果保持这种方式,最终只会遇到问题。

使用自动装配功能,在Symfony 4中默认启用该功能,您几乎可以将任何东西作为参数传递给功能(控制器,存储库等)。

这里,我更改了您的函数的参数。删除了ObjectManager,因为它已经是扩展AbstractController的一部分,并添加了ProjetRepositoryProjet

强烈建议您始终为表格设置action。 “方法”只是一种奖励。

我还划分了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>
© www.soinside.com 2019 - 2024. All rights reserved.