IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[API REST] Validator Formulaire + isValid() [3.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 16
    Par défaut [API REST] Validator Formulaire + isValid()
    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

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 16
    Par défaut
    Hello,

    j'ai trouvé la solution, pour info :
    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
     
    $form->handleRequest($request);
            // Validation des champs du formulaire
            if ($form->isValid()) {
                $aDatas = $form->getData();
                $manew = new New();
                $manew->setBLABLA($aDatas['blabla']);
                ....
                // Validation des valeurs en association des champs du formulaire
                $validator = $this->container->get('validator');
                $errors = $validator->validate($manew);
                if(count($errors)>0){
                    throw new BadRequestHttpException($errors);
                }else{
                    $this->om->persist($manew);
                    $this->om->flush($manew);
                    return new JsonResponse(['status' => 'OK'], Response::HTTP_OK);
                }
            } else {
                throw new BadRequestHttpException((string)$form->getErrors(true,false));
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. valid formulaire + params
    Par philippe123 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 01/09/2005, 15h29
  2. Validation formulaire dynamique
    Par odelayen dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/08/2005, 17h47
  3. test validation formulaire
    Par Nkubi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/06/2005, 11h22
  4. Valider Formulaire
    Par Gourouni dans le forum ASP
    Réponses: 18
    Dernier message: 06/01/2005, 15h34
  5. Pb validation formulaire
    Par cosminutza dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/12/2004, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo