Microframework de symfony 2

symfony_logo

Cela a peut-être échappé à certaines personnes, la version 2.8 offre la possibilité d’utiliser Symfony 2 en tant que microframework.

La version standard contient tout un lot de bundles déjà enregistrés dans le fichier AppKernel,  ainsi que toute une configuration à faire.

Si je vous disais qu’une application peut être fonctionnelle avec un seul fichier, seuls les bundles utiles seront installés et nous plus installés à l’avance.

Comment est-ce possible ?

Cela nous est possible grâce au MicrokernelTrait. Voyons de plus près ce que comporte ce fichier :

  • configureRoutes : permet d’ajouter et d’importer des routes
  • configureContainer : configure le container, pouvant enregistrer des extensions, des services, des paramètres.
  • registerContainerConfiguration : enregistre la configuration
  • loadRoutes : permet l’accès aux routes définies

Faisons une aparté sur la définition d’un trait car cette notion est très importante à comprendre

PhpNet :

Les traits sont un mécanisme de réutilisation de code dans un langage à héritage simple tel que PHP. Un trait tente de réduire certaines limites de l'héritage simple, en autorisant le développeur à réutiliser un certain nombre de méthodes dans des classes indépendantes.

Un trait est semblable à une classe, mais il ne sert qu'à grouper des fonctionnalités d'une manière intéressante. Il n'est pas possible d'instancier un Trait en lui-même. C'est un ajout à l'héritage traditionnel, qui autorise la composition horizontale de comportements, c'est à dire l'utilisation de méthodes de classe sans besoin d'héritage."

 

Un seul fichier pour une application fonctionnelle

Créons notre 1ère page qui affichera Hello au prénom passé en paramètre.

 

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;

use Symfony\Component\Config\Loader\LoaderInterface;

use Symfony\Component\DependencyInjection\ContainerBuilder;

use Symfony\Component\HttpFoundation\Request;

use Symfony\Component\HttpKernel\Kernel;

use Symfony\Component\Routing\RouteCollectionBuilder;

require __DIR__.'/vendor/autoload.php';


class AppKernel extends Kernel

{

use MicroKernelTrait;

public function registerBundles()

{

    return array(

    new Symfony\Bundle\FrameworkBundle\FrameworkBundle()

);

}

protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)

{

    $c->loadFromExtension('framework', array(

              'secret' => 'VOTRE_SECRET'

    ));

}

protected function configureRoutes(RouteCollectionBuilder $routes)

{

        $routes->add('/hello/{name}', 'kernel:helloAction');

}

public function helloAction($name)

{

     return « Hello $name »

}

}


$kernel = new AppKernel('dev', true);

$request = Request::createFromGlobals();

$response = $kernel->handle($request);

$response->send();

$kernel->terminate($request, $response);

 

Quelques explications :

En premier les fichiers dont on aura besoin, notés bien évidemment, le use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait.

Le require pour le fichier autoload.php où dans la version standard est appelé dans le fichier bootstrap.

registerBundles permet d’enregistrer les bundles dont nous aurons besoin.

configureContainer, l'équivalent du fichier config.yml, on retrouvera donc toute notre configuration de l’application.

configureRoutes : permet de définir nos routes, ici /hello/name

On instancie appKernel et on le lance.

Il nous reste plus qu’à exécuter notre page /hello/Matin

Nous avons donc réussi à avoir notre 1ère page en un seul fichier.

 

Installation d'un bundle

Comme expliqué plus haut, le microframework permet de n’utiliser que les bundles dont nous avons besoin. Voyons donc ensemble un exemple d’utilisation d’un nouveau bundle.

Prenons l’exemple de MonologBundle qui permet de logger nos pages.

Rajoutons donc dans notre fichier composer.json :

symfony/monolog-bundle

ou par ligne de commande :

composer require symfony/monolog-bundle

Cela mettra  automatiquement à jour notre fichier composer.json avec ce bundle.

Une fois l’installation terminée, il nous reste plus qu’à le configurer pour pouvoir l’utiliser.

Reprenons notre fichier php :

Ce qui nous donne maintenant :

public function registerBundles()
    {
        return array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
	    new \Symfony\Bundle\MonologBundle\MonologBundle(),
        );
}

Passons à la configuration en modifiant notre fichier :

protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
    {
       
        $c->loadFromExtension('framework', array(
            'secret' => 'VOTRE_SECRET'
        ));
	
	$c->loadFromExtension('monolog', array(
            'handlers' => array(
	    ‘log’ => array(
	    	‘path’ => "%kernel.logs_dir%/%kernel.environment%.log",
	     	‘level’: ’debug ’
		)		
	)
        ));
    }

Voilà, vous pouvez maintenant utiliser le système de logging offert par Monolog.

Vous venez de créer en un seul fichier une application minimaliste mais tout du moins fonctionnelle.

Gardez en tête toutefois que l’utilisation de microframework ne vous impose pas du tout d’avoir tout dans un seul fichier. Tout en gardant l’esprit Symfony (standard), vous pouvez bien évidemment avoir un fichier config.yml que vous appellerez tel quel :

$loader->load(__DIR__.'/config/config.yml')

Vous pouvez faire de même avec un fichier routes.yml

Il faut bien comprendre que l’utilisation du Microframework garde totalement l’esprit de Symfony tout en choisissant quels bundles seront installés et quelle structure de fichier nous aurons, il permet de configurer d’une autre manière notre application mais partage le reste (cache…)

Félicitations ! Vous venez de créer votre 1ere page avec le microframework de Symfony 2 et vous encourage à aller plus loin dans son apprentissage.

@crédits :
http://php.net/manual/fr/language.oop5.traits.php
http://symfony.com/blog/new-in-symfony-2-8-symfony-as-a-microframework

Laisser un commentaire

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

Captcha *