User entity

Dans cet article nous allons créer la partie utilisateur. Si ce n'est pas déjà fait vous pouvez créer la base de donnée avec php bin/console doctrine:database:create

Ensuite nous pouvons créer l'entité utilisateur et sa partie sécurité avec php bin/console make:user

Vous pouvez laisser les propositions par défauts.

create user entity

Vous devriez avoir quatre fichiers créés.

 created: src/Entity/User.php
 created: src/Repository/UserRepository.php
 updated: src/Entity/User.php
 updated: config/packages/security.yaml
<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];

    /**
     * @var string The hashed password
     * @ORM\Column(type="string")
     */
    private $password;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    /**
     * A visual identifier that represents this user.
     *
     * @see UserInterface
     */
    public function getUsername(): string
    {
        return (string) $this->email;
    }

    /**
     * @see UserInterface
     */
    public function getRoles(): array
    {
        $roles = $this->roles;
        // guarantee every user at least has ROLE_USER
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

    public function setRoles(array $roles): self
    {
        $this->roles = $roles;

        return $this;
    }

    /**
     * @see UserInterface
     */
    public function getPassword(): string
    {
        return (string) $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Returning a salt is only needed, if you are not using a modern
     * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml.
     *
     * @see UserInterface
     */
    public function getSalt(): ?string
    {
        return null;
    }

    /**
     * @see UserInterface
     */
    public function eraseCredentials()
    {
        // If you store any temporary, sensitive data on the user, clear it here
        // $this->plainPassword = null;
    }
}

On met à jour la base de donnée

php bin/console doctrine:schema:update --dump-sql

php bin/console doctrine:schema:update --force

Pour déclarer cette entité en tant que ressource api-platform il faut ajouter @ApiResource() dans l'en tête de l'entité

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ApiResource()
 */
class User implements UserInterface

Si on se rend sur http://127.0.0.1:8080/api/docs notre entité User est maintenant présente :

api platform user entity

On peut maintenant utiliser POST /users pour créer un utilisateur

POST user

On peut lister les utilisateurs avec GET /users et retrouver l'utilisateur qu'on vient de créer :

api platform users get collections

Mais on ne veut pas que tout soit renseigné : on veut que notre POST contienne uniquement l'email et le password de façon à avoir

{
  "email" : "email@user.fr",
  "password": "abcABC123@"
}

On rajoute la condition @UniqueEntity(fields={"email"}) afin de s'assurer que les mails enregistrés sont unique

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @UniqueEntity(fields={"email"})
prev next

Commentaires

Connectez-vous pour laisser un commentaire