Bonjour,
Voilà j'essaie désepérement de faire fonctionner un formulaire sous Symfony 4. Mais voilà quoi que je fasse je n'arrive pas à renvoyer à mon controller les datas de mon formulaire.
Voilà ce que j'ai fais et les fichiers que j'ai créer pour
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $username;
/**
* @ORM\Column(type="string", length=255)
*/
private $password;
/**
* @ORM\Column(type="string", length=255)
*/
private $mail;
/**
* @ORM\Column(type="string", length=255)
*/
private $firstName;
/**
* @ORM\Column(type="string", length=255)
*/
private $LastName;
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function getMail(): ?string
{
return $this->mail;
}
public function setMail(string $mail): self
{
$this->mail = $mail;
return $this;
}
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getLastName(): ?string
{
return $this->LastName;
}
public function setLastName(string $LastName): self
{
$this->LastName = $LastName;
return $this;
}
}
<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', TextType::class, [
'invalid_message' => 'Usermname problems',
])
->add('password', TextType::class, [
'invalid_message' => 'Password problems',
])
->add('mail', TextType::class, [
'invalid_message' => 'Mail problems',
])
->add('firstName', TextType::class, [
'invalid_message' => 'FirstName problems',
])
->add('LastName', TextType::class, [
'invalid_message' => 'LastName problems',
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
- Un controller HomeController.php :
<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\UserType;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends AbstractController
{
/**
@Route("/", name="home")
*/
public function index()
{
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
]);
}
/**
@Route("/user/create", name="create")
*/
public function create(Request $request, ObjectManager $manager)
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
$user = $form->getData();
if ($form->isSubmitted()){
echo "Dans le isSubmitted";
if ($form->isValid()) {
echo "Dans le isvalid";
// $entityManager->persist($user);
// $entityManager->flush();
// return $this->redirectToRoute('/');
}
}
return $this->render('home/index.html.twig', [
'form' => $form->createView(),
'user' => $user,
]);
}
}
- Une vue index.html.twig :
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
{%if form is defined %}
{{form_start(form)}}
{{form_row(form.username)}}
{{form_row(form.password)}}
{{form_row(form.mail)}}
{{form_row(form.firstName)}}
{{form_row(form.LastName)}}
<button type="submit">Envoyer</button>
{{form_end(form)}}
{% endif %}
{%if user is defined %}
{{dump(user)}}
{% endif %}
{% endblock %}
Si je mets juste un {{form_widget(form)}}, lors de la validation de mon formulaire je récupère une erreur de type => "The uploaded file was too large. Please try to upload a smaller file". Déjà je comprend pas pourquoi ça fait ceci.
Ensuite voilà ce que je récupère niveau data :
User^ {#437 ▼
-id: null
-username: null
-password: null
-mail: null
-firstName: null
-LastName: null
}
Si certaine pouvez éclairer ma lanterne car la je séche.
Merci pour votre aide.
Bonjour,
Dans le Controller, tu dois récupérer les datas que SI le formulaire est soumis ... Pas avant.
Le
$user = $form->getData();
doit etre dans les
if $form->isSubmitted() et $form->isValid()
Et ne passe pas $user dans la vue ... puisque la page est un NEW USER.
User n'est donc pas encore créé quand tu arrives sur le formulaire
Bonjour, je pensais que la question n'avait pas été posté. J'avais rencontré un bug enfin bref.
Pour te repondre @bidule76 c'etait surtout pour voir si je recevais bien des données quand même. Idem pour le renvoie de $user à la vue. Car je fesais un dump dans celle ci
Pour mon problème c'etait le php.ini qui avait des valeur max_upload et une autre à -1. Ce que symfony n'aime pas apparament.
Hello,
@Bidule76 a bien répondu, juste quelques précisions pour info.
La ligne :
$user = $form->getData();
est en réalité optionnelle. En fait, c'est la méthode handleRequest() qui se charge d'hydrater ton entité User à partir des données reçues dans la réponse (généralement en POST). La méthode isSubmitted() permet de savoir si le formulaire a été soumis, et la méthode isValid() fait passer le validateur sur les données de User ($user), pour vérifier tes données (si tu as mis des contraintes de validation dans ton form ou dans ton entité, c'est à ce moment là qu'elles sont vérifiées).
Le lien vers la doc : https://symfony.com/doc/current/forms.html#processing-forms