Les bases de Symfony – Créer un bundle Hello World!

Immédiatement après l’installation du framework Symfony, vous aurez probablement envie de créer votre premier bundle et de commencer à développer votre propre code. Techniquement rien de plus simple, mais cela nécessite quelques éclaircissements qui vous seront bien utiles pour la suite de votre aventure avec Symfony.

Étape 1 : Créer un nouveau bundle

La création d’un bundle personnalisé peut se faire via une simple ligne de commande qui vous invitera notamment à le nommer en respectant la convention de nommage Entreprise\ProjetBundle, avec :

  • Entreprise : le nom de votre entreprise, ou à défaut, votre nom ou pseudo, sans espaces et en commençant par une majuscule ;
  • Projet : le nom de votre projet, sans espaces et en commençant par une majuscule ;
  • Bundle : rien à modifier ici.

Pour un premier bundle, vous pouvez laisser les autres valeurs par défaut.

$ php bin/console generate:bundle

                                            
  Welcome to the Symfony bundle generator!  
                                            

Are you planning on sharing this bundle across multiple applications? [no]: 

Your application code must be written in bundles. This command helps
you generate them easily.

Give your bundle a descriptive name, like BlogBundle.
Bundle name: Enterprise\ProjectBundle   

In your code, a bundle is often referenced by its name. It can be the
concatenation of all namespace parts but it's really up to you to come
up with a unique name (a good practice is to start with the vendor name).
Based on the namespace, we suggest EnterpriseProjectBundle.

Bundle name [EnterpriseProjectBundle]: 

Bundles are usually generated into the src/ directory. Unless you're
doing something custom, hit enter to keep this default!

Target Directory [src/]: 

What format do you want to use for your generated configuration?

Configuration format (annotation, yml, xml, php) [annotation]: 

                     
  Bundle generation  
                     

> Generating a sample bundle skeleton into app/../src/Enterprise/ProjectBundle
  created ./app/../src/Enterprise/ProjectBundle/
  created ./app/../src/Enterprise/ProjectBundle/EnterpriseProjectBundle.php
  created ./app/../src/Enterprise/ProjectBundle/Controller/
  created ./app/../src/Enterprise/ProjectBundle/Controller/DefaultController.php
  created ./app/../tests/EnterpriseProjectBundle/Controller/
  created ./app/../tests/EnterpriseProjectBundle/Controller/DefaultControllerTest.php
  created ./app/../src/Enterprise/ProjectBundle/Resources/views/Default/
  created ./app/../src/Enterprise/ProjectBundle/Resources/views/Default/index.html.twig
  created ./app/../src/Enterprise/ProjectBundle/Resources/config/
  created ./app/../src/Enterprise/ProjectBundle/Resources/config/services.yml
> Checking that the bundle is autoloaded
> Enabling the bundle inside app/AppKernel.php
  updated ./app/AppKernel.php
> Importing the bundle's routes from the app/config/routing.yml file
  updated ./app/config/routing.yml
> Importing the bundle's services.yml from the app/config/config.yml file
  updated ./app/config/config.yml

                                         
  Everything is OK! Now get to work :). 

Activation du nouveau bundle

Vous n’avez rien de spécial à faire ici, puisque la commande précédente a fait tout le travail, mais c’est important de le mentionner pour comprendre le fonctionnement de Symfony.

L’activation d’un nouveau bundle se fait par l’intermédiaire du fichier AppKernel.php situé dans le répertoire app/, en ajoutant la référence au point d’entrée du bundle.

<?php

public function registerBundles()
{
	$bundles = array(
 		// ...
    	new Enterprise\ProjectBundle\EnterpriseProjectBundle(),
        // ...
    );
}
app/AppKernel.php

Maintenant que votre bundle est créé, il va être utile que vous compreniez parfaitement comment s’articulent l’ensemble des répertoires de Symfony.

L’arborescence de Symfony

Le framework Symfony utilise toujours la même arborescence de base, qui ne devra normalement pas être modifiée durant le cycle de développement de votre application :

  • app/ : contient les fichiers de configuration et de paramètres de votre application ainsi que les templates par défaut.
  • bin/ : contient des scripts à exécuter en ligne de commande.
  • src/ : contient vos bundles personnalisés. C’est ici que vous placerez votre propre code.
  • tests/ : contient les tests automatisés de votre application.
  • var/ : contient les fichiers générés automatiquement par le framework : le cache, les journaux d’événements (notamment les erreurs), les fichiers correspondants aux sessions des utilisateurs et les fichiers uploadés depuis votre application.
  • vendor/ : contient l’ensemble des packages externes utilisés par votre application. Ces packages peuvent être gérés avec Composer grace au fichier composer.json présent à la racine de votre arborescence.
  • web/ : contient l’ensemble des fichiers accessibles publiquement sur votre application, notamment vos assets (fichiers de styles, de scripts, images, etc.).

L’arborescence d’un bundle Symfony

Par défaut, un nouveau bundle contient au moins les répertoires suivants :

  • src/Enterprise/ProjectBundle/ : répertoire principal de votre bundle où sont stockés l’ensemble de ses fichiers
    • Controller/ : contient l’ensemble des contrôleurs, faisant le lien entre les entités (modèles d’objets personnalisés) et les templates (vues) et définissant les points d’entrée de votre bundle.
    • Resources/ :
      • config/ : contient les fichiers de configuration propres à votre bundle.
      • views/ : contient l’ensemble de vos templates, idéalement avec l’extension .html.twig qui seront rendus par le moteur Twig.

Au fur et à mesure de votre développement, vous serez amenés à utiliser d’autres répertoires et fichiers, tels que :

  • src/Enterprise/ProjectBundle/ :
    • DependencyInjection/ : contient les fichiers nécessaires à la transformation de votre bundle en extension, pour l’utiliser au sein d’autres applications ou pour le publier publiquement.
    • Entity/ : contient l’ensemble de vos entités (modèles), représentant vos objets personnalisés.
    • Form/ : contient l’ensemble des formulaires de votre application.
    • Repository/ : contient les requêtes de bases de données personnalisées relatives à vos entités.
    • Resources/public/ : contient les assets propres à votre bundle, qui seront liés au dossier web par l’intermédiaire du gestionnaire d’assets Assetic.
    • Resources/translations/ : contient vos chaînes de textes, dans différentes langues, afin de proposer votre application dans plusieurs langues.

Étape 2 : Configurer les points d’entrées de votre bundle

Maintenant que vous connaissez l’architecture de votre bundle, vous allez pouvoir configurer son ou ses points d’entrées. Pour cela, éditez le fichier DefaultController.php situé dans le répertoire Controllers/ de votre bundle.

L’architecture d’un contrôleur Symfony est simple et respecte le modèle MVC (modèle-vue-controlêur). Aucune interaction directe avec la base de données et aucun code HTML ne devraient y être présents. Cela est réservé à vos entités (modèles) et templates (vues).

Vous pouvez avoir plusieurs contrôleurs dans votre bundle, à condition que chaque fichier respecte une bonne structure, à commencer par le nom de fichier NomController.php Nom sera le nom de la fonction implémentée par le contrôleur, par exemple User, Blog, Contact, etc. Le contrôleur devra également hériter de la classe de base Controller qui vous permettra d’utiliser de nombreuses fonctions de base du framework directement depuis votre objet contrôleur.

<?php

namespace Enterprise\ProjectBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
      //...
}
src/Enterprise/ProjectBundle/Controllers/DefaultController.php

Le contrôleur est ensuite découpé en méthodes, représentant les pages de votre application. Pour créer une page index à votre application, vous pouvez ainsi créer une méthode indexAction(), alors  que pour une page par exemple nommée contact, vous auriez créé une méthode contactAction().

Pour définir les points d’entrées de votre application, appelées routes dans le framework Symfony, vous pouvez utiliser l’annotation  @Route au niveau des commentaires PHPDoc de vos méthodes de contrôleurs.  Le premier argument représente le chemin d’accès et le deuxième argument représente le nom de la route. Ce nom vous sera utile plus tard pour générer des liens dans votre application.

Pour créer la page par défaut de votre application, appelée homepage et accessible à l’URL http://votredomaine.fr/, la route sera simplement :

    //...

	/**
	 * Custom application homepage.
	 *
	 * @Route("/", name="homepage")
	 *
	 * @return \Symfony\Component\HttpFoundation\Response
	 */
    public function indexAction()
    {
	//...
    }

//...
src/Enterprise/ProjectBundle/Controllers/DefaultController.php

Étape 3 : Créer un template de base pour votre bundle

Maintenant que votre contrôleur est routé au sein du framework Symfony, il va devoir générer du code HTML et le retourner à l’utilisateur pour être rendu dans son navigateur.

Vos méthodes doivent obligatoirement retourner un objet de type ResponsePour cela, vous disposez notamment de la méthode render héritée de la classe de base Controller. Cette méthode vous permet de transformer un fichier de template situé dans le répertoire Resources/views de votre bundle en son équivalent HTML.

Pour votre méthode indexAction() du contrôleur DefaultController.php, vous pouvez ainsi choisir de générer le rendu d’un fichier de template spécifique :

//...

	public function indexAction()
	{
		return $this->render('@App/Default/index.html.twig');
	}

//...
src/Enterprise/ProjectBundle/Controllers/DefaultController.php

 

Dans la méthode indexAction() précédente, le fichier index.html.twig est appelé. C’est dans ce fichier que vous devez disposer votre code HTML à afficher sur votre page.

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

{% block body %}
<p>Hello World!</p>
{% endblock body %}
src/Enterprise/ProjectBundle/Resources/views/Default/index.html.twig

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *