[API REST] Validator Formulaire + isValid()
Bonjour,
J'utilise la version 3.1 de Symfony avec FosRestBundle et le validator symfony.
Entité New.php
Code:
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:
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:
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:
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