Bonjour,

J'utilise la version 3.1 de Symfony avec FosRestBundle et le validator symfony.

Entité New.php
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 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
 
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',
        ));
    }
}
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
 
/**
 * @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
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 premier test passe et insère la new en base de données.
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