Bienvenue dans ce quatrième volet de la série Symfony 7. Aujourd'hui, nous allons nous concentrer sur la création de la base de données et des tables nécessaires à l'authentification des utilisateurs pour notre projet OpenBlog.
Plan de la Base de Données
Notre schéma de base de données est structuré de la manière suivante :
users: Table des utilisateurs.categories: Table des catégories.keywords: Table des mots-clés.posts: Table des articles.comments: Table des commentaires.post_categories: Table de relation entre les articles et les catégories.post_keywords: Table de relation entre les articles et les mots-clés.
Chaque table a des relations spécifiques et des contraintes. Assurez-vous d'avoir des connaissances de base en SQL pour comprendre la structure des tables et la gestion des relations.
Le schéma de la base de données est accessible sur DrawSQL.
Création de l'Entité Utilisateur
Commençons par créer la table des utilisateurs. Ouvrez votre terminal et exécutez la commande suivante pour créer une entité utilisateur :
symfony console make:userRépondez aux questions posées par le terminal pour configurer l'entité :
- Nom de la classe d'authentification de sécurité :
Users - Stocker les données utilisateurs dans la base de données via Doctrine :
yes - Identifiant unique pour l'utilisateur :
nickname - Hacher les mots de passe :
yes
Cette commande génère deux fichiers : Users.php dans le dossier src/Entity et UsersRepository.php dans le dossier src/Repository.
Ajout de Propriétés à l'Entité Utilisateur
Pour ajouter des propriétés supplémentaires, utilisez la commande make:entity :
symfony console make:entityPrécisez que l'entité à modifier est Users et ajoutez les propriétés suivantes :
Email :
- Type :
string - Longueur :
255 - Peut être nul :
no
isVerified :
- Type :
boolean - Peut être nul :
no
Après avoir exécuté ces commandes, votre fichier Users.php devrait ressembler à ceci :
<?php
namespace App\Entity;
use App\Repository\UsersRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity(repositoryClass: UsersRepository::class)]
class Users implements UserInterface, PasswordAuthenticatedUserInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 180, unique: true)]
private ?string $nickname = null;
#[ORM\Column]
private array $roles = [];
/**
* @var string The hashed password
*/
#[ORM\Column]
private ?string $password = null;
#[ORM\Column(length: 255)]
private ?string $email = null;
public function getId(): ?int
{
return $this->id;
}
public function getNickname(): ?string
{
return $this->nickname;
}
public function setNickname(string $nickname): static
{
$this->nickname = $nickname;
return $this;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUserIdentifier(): string
{
return (string) $this->nickname;
}
/**
* @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): static
{
$this->roles = $roles;
return $this;
}
/**
* @see PasswordAuthenticatedUserInterface
*/
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): static
{
$this->password = $password;
return $this;
}
/**
* @see UserInterface
*/
public function eraseCredentials(): void
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): static
{
$this->email = $email;
return $this;
}
public function isVerified(): ?bool
{
return $this->isVerified;
}
public function setIsVerified(bool $isVerified): static
{
$this->isVerified = $isVerified;
return $this;
}
}Création des Autres Entités
Répétez le processus pour créer les autres entités : Keywords, Categories, Posts, et Comments. Voici quelques exemples de commandes pour créer et ajouter des propriétés à ces entités.
Keywords
symfony console make:entity KeywordsPropriétés :
- Name :
- Type :
string - Longueur :
50 - Peut être nul :
no
- Type :
- Slug :
- Type :
string - Longueur :
60 - Peut être nul :
no
- Type :
Categories
symfony console make:entity CategoriesPropriétés :
- Name :
- Type :
string - Longueur :
50 - Peut être nul :
no
- Type :
- Slug :
- Type :
string - Longueur :
60 - Peut être nul :
no
- Type :
- Parent :
- Type :
relation - Cible :
Categories - Type de relation :
many-to-one - Peut être nul :
yes
- Type :
Posts
symfony console make:entity PostsPropriétés :
- Title :
- Type :
string - Longueur :
255 - Peut être nul :
no
- Type :
- Slug :
- Type :
string - Longueur :
255 - Peut être nul :
no
- Type :
- Content :
- Type :
text - Peut être nul :
no
- Type :
- FeaturedImage :
- Type :
string - Longueur :
255 - Peut être nul :
no
- Type :
- User :
- Type :
relation - Cible :
Users - Type de relation :
many-to-one - Peut être nul :
no - Suppression en cascade :
yes
- Type :
Ajoutez également les relations many-to-many pour les Categories et les Keywords :
- Categories :
- Type :
relation - Cible :
Categories - Type de relation :
many-to-many - Propriété inverse :
posts
- Type :
- Keywords :
- Type :
relation - Cible :
Keywords - Type de relation :
many-to-many - Propriété inverse :
posts
- Type :
Comments
symfony console make:entity CommentsPropriétés :
- Content :
- Type :
text - Peut être nul :
no
- Type :
- IsReply :
- Type :
boolean - Peut être nul :
no
- Type :
- Parent :
- Type :
relation - Cible :
Comments - Type de relation :
many-to-one - Peut être nul :
yes
- Type :
- User :
- Type :
relation - Cible :
Users - Type de relation :
many-to-one - Peut être nul :
no - Suppression en cascade :
yes
- Type :
- Post :
- Type :
relation - Cible :
Posts - Type de relation :
many-to-one - Peut être nul :
no - Suppression en cascade :
yes
- Type :
Génération des Fichiers de Migration
Après avoir créé toutes vos entités, générez les fichiers de migration pour créer les tables dans la base de données :
symfony console make:migrationCette commande crée un fichier de migration dans le dossier migrations. Pour appliquer cette migration et créer les tables dans la base de données, exécutez :
symfony console doctrine:migrations:migrateVérification de la Base de Données
Accédez à votre outil de gestion de base de données (comme PHPMyAdmin) pour vérifier que toutes les tables ont été créées correctement. Vous devriez voir les tables suivantes :
- users
- categories
- keywords
- posts
- comments
- post_categories
- post_keywords
Conclusion
Nous avons vu comment créer des entités et générer les tables correspondantes dans la base de données pour notre projet OpenBlog. La prochaine fois, nous aborderons l'authentification des utilisateurs, y compris les formulaires de connexion et d'inscription.
Obtenir de l'aide
Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat.