Symfony bundle

Créer un bundle Symfony

Spread the love

Un bundle Symfony est similaire à un plugin dans d’autres logiciels, mais en mieux. Il permet d’ajouter de nouvelles fonctionnalités à votre projet.

Vous devez créer un bundle dans deux cas d’utilisation :

  • Pour partager du code symfony
  • Pour encapsuler une bibliothèque

Vous pouvez voir de nombreux exemples de bundle partageant du code :

  • symfony/maker-bundle
  • symfony/framework-bundle

Et encapsulant une bibliothèque :

  • symfony/twig-bundle
  • symfony/swiftmailer-bundle

Initialisation

Créez votre projet de bundle :

mkdir  foo-bundle 
cd  foo-bundle

Initialisez votre bundle :

composer init 
composer req symfony/http-kernel 
git  init

Le seul fichier requis pour un bundle est XXXBundle.php.

Ce fichier sera chargé par le Symfony kernel.

Par convention, le nom du bundle est CompanyComposantBundle.php

touch KioraFooBunlde.php

Editez le fichier KioraFooBundle.php :

<?php
namespace Kiora\FooBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class KioraFooBundle extends Bundle
{
}

Editez le fichier composer.json :

{
   "name":"kiora/foo-bundle",
   "description":"A bundle",
   "type":"library",
   "autoload":{
      "psr-4":{
         "Kiora\\FooBundle\\":""
      }
   },
   "require":{
      "symfony/http-kernel":"^4.4|^5.2"
   }
}

Génial, vous venez de créer votre premier bundle minimaliste. Mais un bundle doit faire quelque chose. Actuellement vous avez une coquille vide. Nous allons voir pour la remplir un petit peu.

Ajout de logique

Pour notre exemple, nous allons créer un bundle glue (pour connecter un composant).

Imaginez que vous ayez une bibliothèque personnalisée et que vous souhaitiez simplifier son utilisation dans les projets Symfony.

Initialisation

composer req symfony/dependency-injection
composer req symfony/config
composer req your/library
mkdir -p Resources/config
mkdir DependencyInjection

touch DependencyInjection/Configuration.php
touch DependencyInjection/KioraFooExtension.php
touch Resources/config/services.xml

Oui, seulement trois nouveaux fichiers. Ces trois fichiers ont des rôles précis :

  • Configuration.php définit l’arborescence de configuration de votre bundle.
  • KioraFooExtension.php chargera la configuration DI (services, paramètres, etc.) de votre bundle.
  • services.xml définit les définitions de vos services.

ℹ Le fichier d’extension doit être nommé comme le bundle XXXBundle → XXXExtension pour être chargé automatiquement

Edition

Vous allez éditer les trois fichiers Configuration.php, KioraFooExtension.php et services.xml.

Configuration.php :

<?php

namespace Kiora\FooBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('kiora_kiora');

        $treeBuilder
            ->getRootNode()
            ->children()
                ->scalarNode('username')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
                ->scalarNode('password')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
            ->end();

        return $treeBuilder;
    }
}

KioraFooExtension.php :

<?php

namespace Kiora\FooBundle\DependencyInjection;


use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;

class KioraFooExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.xml');

        $configuration = new Configuration();
        $processor = new Processor();
        $config = $processor->processConfiguration($configuration, $configs);

        $container->setParameter('kiora.username', $config['username']);
        $container->setParameter('kiora.password', $config['password']);

    }
}

services.xml :

<?xml version="1.0" encoding="UTF-8"?>
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
   <services>
      <service id="your.libraray" class="YourLibrary" public="true">
         <argument>%kiora.username%</argument>
         <argument>%kiora.password%</argument>
      </service>
      <service id="YourLibrary" alias="your.libraray" />
   </services>
</container>

Trucs et astuces

Packagist

Commencez avec un bundle vide, publiez-le et enregistrez-le sur https://packagist.org (ou autre).

Bundle local

Avant cela, vous pouvez modifier votre bundle directement dans le dossier vendor. Avec cette méthode, vous pouvez tester votre bundle.

Si vous ne souhaitez pas le publier avant d’avoir terminé, vous pouvez l’installer localement :

//composer.json 
{ // ... "repositories" : [ 
      { "type" : "path" ,
          "url" : "../foo-bundle" 
      } 
   ] // ... 
} 
composer req kiora/foo-bundle dev-master
chevron_left
chevron_right

Laisser un commentaire

%d blogueurs aiment cette page :