Premiers pas avec Doctrine sur Symfony 2

Posté par Lecesne Yannick dans Symfony

Symfony

Premiers pas avec Doctrine sur Symfony 2

Apprenez à enregistrer vos informations avec Doctrine

Petit rappel

À ce stade du tutoriel vous devriez avoir :

- Quelques pages statiques
- Une page de contact qui fonctionne (vous pouvez tester avec mail catcher)

Vous pouvez à tout moment récupérer la version du site sur le repository https://github.com/vikinglab/tuto-blog

L'objectif

Dans cette dernière partie du tutoriel je vais vous montrer comment administrer une liste d'articles (sans photos). Nous ne verrons pas la pagination dans cet article mais si vous voulez la mettre en place je vous conseil ce bundle KnpPaginatorBundle

 

Création de notre entitée Article

Nous allons créer notre entitée Article avec la commande suivante :

Création de l'entité Article

Et voilà notre entitée article vient d'être créée, vous devriez avoir le dossier "Entity" dans l'architecture de votre projet qui vient de se créer :

Voici le contenu de notre entitée Article :

<?php

namespace T\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Article
*
* @ORM\Table()
* @ORM\Entity
*/
class Article
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;

/**
* @var string
*
* @ORM\Column(name="content", type="text")
*/
private $content;

/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime")
*/
private $date;


/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set title
*
* @param string $title
* @return Article
*/
public function setTitle($title)
{
$this->title = $title;

return $this;
}

/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}

/**
* Set content
*
* @param string $content
* @return Article
*/
public function setContent($content)
{
$this->content = $content;

return $this;
}

/**
* Get content
*
* @return string
*/
public function getContent()
{
return $this->content;
}

/**
* Set date
*
* @param \DateTime $date
* @return Article
*/
public function setDate($date)
{
$this->date = $date;

return $this;
}

/**
* Get date
*
* @return \DateTime
*/
public function getDate()
{
return $this->date;
}
}

Lors de la création de notre entitée j'ai choisi d'utilisé les annotations, mais rien ne vous empêche d'utilisé le format yml ou bien xml. Je sais je ne suis pas très logique car j'utilise pour le routing le format Yml ... Ce n'est qu'une question de goût après tout mais pour mes entitées j'aime avoir toutes les informations sous les yeux et pour mes controlleurs, au contraire je préfére séparé dans un autre fichier le "routing" et mes methodes ... Une mauvaise habitude peut être :/ mais encore une fois a vous de choisir ;) c'est vous qui décider ! (https://youtu.be/6Tc6Pwl9OtU?t=10)

Je pense que pour les prochains tutos je ferai l'effort d'utiliser que les annotations, mais au moins cela vous permet de voir deux cas de figure :)

Créons notre base de données

Nous allons d'abbord choisir un nom pour notre base donnée et aussi changer les login de mysql, ça se passe dans votre fichier parameters.yml (app/config/parameters.yml)

# This file is auto-generated during the composer install
parameters:
database_host: 127.0.0.1
database_port: null
database_name: tutoblog
database_user: root
database_password: 'votremotdepasse' # ici je met des "'" autour du mdp car j'ai déjà eu des problèmes avec des caractères spéciaux dans les mots de passe
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
mailer_port: 1025
secret: f3f7b01a7f2404f69add058c8a6afdcba39d21bc

Une fois votre configuration faite, nous allons créer la base de données ! lancer cette commande :

Et voilà vous devriez voir dans votre phpmyadmin une nouvelle base de données, chez moi elle se nomme tutoblog

La base de donnée est créée, il nous faut maintenant mettre à jour la base de donnée pour que Doctrine génére une table Article avec les colonnes que nous avons défini grace à nos annotations dans l'entitée Article.

Pour savoir ce que va executer le schema update vous pouvez le vérifier en ajouter l'option --dump-sql ça va vous afficher la requête que le schema update souhaite executer sans la lancer.

Cette commande demande à doctrine de venir lire notre shèma de donnée (nos entitée et leurs annotations) et elle construit notre structure de base de donnée.

Lorsque vous développer et faite de grosse modifications dans la structure de votre base (modification d'entités / ajout) je vous conseil d'utiliser Doctrine Migration c'est un bundle qui va vous générer un fichier php avec dedans toute les commande sql que ferai votre schema update. Cela va vous permettre de vérifier et/ou modifier la requête que pourrait lancer le schema update.

Attention une fois ce fichier php créer app/DoctrineMigrations/... vous devez le lancer grace à la commande :

php app/console doctrine:migration:migrate 

Cette commande va venir chercher les migrations dans le dossier app/DoctrineMigration et les executer 1 par 1

grâce aux migrations vous pourrai aussi annuler les modifications faite en base de donnée. En regardant de plus prêt dans le fichier php que doctrine migration a générer vous allez voir qu'il y a deux méthodes up et down up est votre modification sur la bdd et le down ... l'inverse. En cas de problème / d'erreurs, vous pouvez faire demi tour.

Le CRUD

Késako ? Create Read Update Delete. En d'autre termes tous ce qu'il nous faut pour gerer nos articles.

Ici vous avez 2 solutions qui s'offre à vous.

  1. Soit vous faites tout à la main dans un controlleur.
  2. Soit vous utilisez une commande magique de symfony qui génére le CRUD d'une entitée doctrine.

Comme je suis une grosse faignasse, je vais choisir la deuxième solution :D
Bien sûre je vous conseil fortement de décortiqué le code générer pour pouvoir refaire le code à votre sauce plus tard.

C'est parti !

Et voilà, cela vous à ajouter un prefix de route dans routing.yml de notre bundle :

t_main_article:
resource: "@TMainBundle/Resources/config/routing/article.yml"
prefix: /article

Comme vous pouvez le voir un fichier routing/article.yml a été créer. Dedans vous aller retrouver les routes pour acceder au différente méthodes du controlleur ArticleController.php. Mais pas que ! la commande nous a aussi créer des vues "basique" pour chaque méthode du controller.

On résume :

  • Un controller avec les Méthodes CRUD a été créer
  • Le routing a été mis à jour
  • Les vues du CRUD on été créer

Il ne nous reste plus qu'a nous rendre sur l'url http://localhost/tuto-blog/web/app_dev.php/article

Bon j'ai sauter une petite étape, dans les vues generer par la commande, les vues extends par defaut de :

{% extends '::base.html.twig' %}

Mais souvenez-vous je l'ai déplacé dans mon bundle donc il faut changer cet appel
Il faut juste remplacer par :

{% extends 'TMainBundle::base.html.twig' %}

et je me suis permis de changer le block "body" par defaut :

{% block title %}
{#je recupere le contenu du block parent#}
{{ parent() }} - Article
{% endblock %}

{% block content %}
{# ... #}
{% endblock %}

Vuuuaaalaaaaa ! vous pouvez maintenant ajouter / supprimer / modifier les articles enregistrer en bdd. JE vous laisses décortiquer les méthodes générer par Symfony, vous verrez qu'il est possible d'optimisé tout ça.
Mais pour faire un petit site rapide c'est largement surffisant. 

Et la suite ?

C'est bien d'avoir la possibilité d'ajouter des articles mais c'est mieux que ce soit seulement VOUS qui pouvez le faire. Pour ça il faut mettre en place une securité sur les url d'ajout/suppression/modification des articles.

Vous pouvez aussi vous amusez a externaliser les formulaires présent dans le CRUD qui a été generer, pour avoir des form builder tout propre :)

Voilà j'espére que ces 3 petit tuto vous ont plus et qu'il vous ont été utiles. Je ferai peut être un autre tuto pour vous montrez comment sécuriser l'accé à la création des articles.

Tout est present dans le repository sur github si jamais vous avez louper une étape, un petit git clone et c'est finish.

petit rappel => https://github.com/vikinglab/tuto-blog.git