Bonjour,
J'utilise la version 3.1 de Symfony avec FosRestBundle et le validator symfony.
Entité New.php
Voici mon NewType (form) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 namespace AppBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="new") * @ORM\Entity(repositoryClass="AppBundle\Repository\New") */ class New { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="libelle", type="string") * @Assert\NotBlank() */ private $libelle; ....
Voici mon controller avec la méthode pour le post
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 namespace AppBundle\Form; .... class NewType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('libelle', TextType::class, ['required' => true]) ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\New', )); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /** * @param Request $request the request object * * @Post("/new") * * @return FormTypeInterface|View */ public function postNewAction(Request $request) { try { $form = $this->createForm(NewType::class); // Formulaire valide if ($form->handleRequest($request)->isValid()) { echo 'OK'; } else { throw new Exception.... } } catch (Exception $e) { return new JsonResponse(['status' => 'KO', 'message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } }
Mon test fonctionnel du post
Le premier test passe et insère la new en base de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 namespace Tests\AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class NewControllerTest extends WebTestCase { public function testCreateNew() { $client = self::createClient(); // TEST 1 $aDatas = array( "new" => array ( 'libelle' => 'TEST QUI INSERT EN BASE' ) ); $client->request( 'POST', '/api/new.json', $aDatas ); $this->assertEquals(200, $client->getResponse()->getStatusCode()); // TEST 2 $aDatas = array( "new" => array ( 'libelle' => '' ) ); $client->request( 'POST', '/api/new.json', $aDatas ); $this->assertEquals(200, $client->getResponse()->getStatusCode()); } }
Le 2e test passe aussi mais n'insère pas la new en base de données, car le libelle est vide.
Mais le isValid() passe malgré que le libelle soit vide.
Question :
Le isValid() ne renvoie pas false si un Assert (NotBlank en l'occurence) n'est pas respecté ?
Comment faire pour catcher l'erreur si une donnée ne respecte pas les contraintes Assert de l'entity dans la méthode POST ?
Merci pour vos retours et experiences
Partager