我上个月正在从事一个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 4编码的方式是完全错误的...您最好尽早在Symfony 4上组建自己。如果保持这种方式,最终只会遇到问题。
使用自动装配功能,在Symfony 4中默认启用该功能,您几乎可以将任何东西作为参数传递给功能(控制器,存储库等)。
这里,我更改了您的函数的参数。删除了ObjectManager
,因为它已经是扩展AbstractController
的一部分,并添加了ProjetRepository
和Projet
。
强烈建议您始终为表格设置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>