Unicité d'une ressource impossible (je crée des doublons)

a marqué ce sujet comme résolu.

Bonjour,

Je viens solliciter votre aide pour bien comprendre le tuto sur la création d’une API REST avec Symfony3 (il est très didactique, merci à son auteur !), et plus précisément sur la partie Création des ressources.

Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// src/AppBundle/Controller/PlaceController.php
    /**
     * @Rest\View(statusCode=Response::HTTP_CREATED)
     * @Rest\Post("/places")
     */
    public function postPlacesAction(Request $request)
    {
        $place = new Place();
        $form = $this->createForm(PlaceType::class, $place);

        $form->submit($request->request->all()); // validation des données

        if ($form->isValid()) {
            $em = $this->get('doctrine.orm.entity_manager');
            $em->persist($place);
            $em->flush();
            return $place;
        } else {
            return $form;
        }
    }
 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
// src/AppBundle/Form/Type/PlaceType.php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PlaceType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('address');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundle\Entity\Place',
            // Cross-Site Request Forgery désactivée : pas de session utilisée (API stateless)
            'csrf_protection' => false
        ]);
    }

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// src/AppBundle/Entity/Place.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 * @ORM\Table(name="places",
 *      uniqueConstraints={@ORM\UniqueConstraint(name="places_name_unique",columns={"name"})}
 * )
 */
class Place
{
    // ...
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// app/config/validation.yml
AppBundle\Entity\Place:
  constraints: 
    - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: name
  properties:
    name:
      - NotBlank: ~
      - Type: string
    address:
      - NotBlank: ~
      - Type: string

J’ai beau tout relire et comparer avec le code du tuto, je ne vois pas ce que je fais de mal. Pourtant, avec Postman si je lance 3 requêtes POST, j’ai bien 3 enregistrements dans ma table au lieu d’1. Je n’ai jamais l’erreur 400 Bad Request expliquée dans le tuto.

Par contre si j’ajoute une contrainte d’unicité dans ma table sur le champ name, là j’ai bien l’erreur m’indiquant que je crée un doublon. Mais ce n’est pas ce qui est indiqué, j’aimerais y arriver avec la code PHP.

Merci pour votre aide !

+0 -0

Aaaah quel idiot j’ai créé le fichier de validation dans le mauvais répertoire !

Il faut le mettre dans src/AppBundle/Resources/config/validation.yml, et pas dans app/config/validation.yml ! (même si je trouverai plus logique de le mettre avec les autres fichiers yml, ce choix me paraît étrange).

Désolé du dérangement !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte