Я буду тупым об этом, но то, как вы кодируете с помощью 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>