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