Une fonctionnalité très importante des services est la possibilité d'utiliser les
tags. Les tags sont en fait des options ajoutées à un service pour lui donner la capacité d'intervenir différemment avec Symfony. Par exemple, il existe un tag
twig.extension qui signale à Symfony que le service est une extension Twig.
Nous allons ici parler des tags les plus importants, ainsi que comment les mettre en place.
Extension Twig
Pour l'exemple, nous allons transformer notre SdzAntispam pour lui ajouter la possibilité de vérifier un texte de la vue. Adaptons la configuration du service :
Code : Autre1
2
3
4
5
6
7
| parameters:
services:
sdz_blog.antispam:
class: Sdz\BlogBundle\Service\SdzAntispam
tags:
- { name: twig.extension } |
Notre service sera donc traité comme une extension Twig. Cependant, un service implantant ce tag doit étendre Twig_Extension. Adaptons le code du service en implémentant les méthodes getFunctions() et getName() obligatoire :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 | <?php
// src/Sdz/BlogBundle/Service/SdzAntispam.php
namespace Sdz\BlogBundle\Service;
/**
* Un anti-spam simple pour Symfony2.
*
* @author Leglopin
*/
class SdzAntispam extends \Twig_Extension
{
// La méthode getName(), obligatoire
public function getName()
{
return 'SdzAntispam';
}
// La méthode getFunctions(), qui retourne un tableau avec les fonctions qui peuvent être appelées depuis cette extension
public function getFunctions()
{
return array(
'antispam_check' => new \Twig_Function_Method($this, 'isSpam')
);
// 'antispam_check' est le nom de la fonction qui sera disponible sous Twig
// 'new \Twig_Function_Method($this, 'isSpam') ' est la façon de dire que cette fonction va exécuter notre méthode isSpam ci-dessous
}
/**
* Vérifie si le texte est un spam ou non.
* Un texte est considéré comme spam à partir de 3 liens
* ou adresses e-mails dans son contenu.
*
* @param string $text
*/
public function isSpam($text)
{
if( ($this->countLinks($text) + $this->countMails($text)) >= 3 )
{
return true;
}
else
{
return false;
}
}
// ...
}
|
Vous pouvez maintenant utiliser la fonction dans Twig :
Code : Autre1
| {{ antispam_check('Texte') }} |
Pour plus d'informations à propos de la création d'extensions pour Twig, lisez ceci :
http://twig.sensiolabs.org/doc/extensions.html.
Les évènements du cœur
Les services peuvent être utilisés avec le gestionnaire d'évènements. Un chapitre sera bientôt disponible à ce sujet. Vous pouvez en attendant lire
la documentation à ce sujet.
Les types de champs de formulaire
Cette fonctionnalité est très pratique, mais comme elle n'est pas documentée, je ne connais que ce que j'ai découvert par moi-même, et il se peut qu'il manque quelques fonctionnalités qui pourraient être intéressantes. N'hésitez pas à faire des recherches

.
Pour déclarer un type de champ, il faut utiliser le tag
form.type et indiquer un alias. Par exemple, pour un champ
ckeditor (
un éditeur WYSIWWYG) :
Code : Autre1
2
3
4
5
| services:
sdz_blog.ckeditor:
class: Sdz\BlogBundle\Form\Extension\CkeditorType
tags:
- { name: form.type, alias: ckeditor } |
La classe CkeditorType contient alors :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | <?php
// src/Sdz/BlogBundle/Form/Extension/CkeditorType.php
/**
* Type de champ de formulaire pour CKEditor.
*
* @author Leglopin
*/
namespace Sdz\BlogBundle\Form\Extension;
use Symfony\Component\Form\AbstractType;
class CkeditorType extends AbstractType
{
public function getParent(array $options)
{
return 'textarea';
}
public function getName()
{
return 'ckeditor';
}
public function getDefaultOptions(array $options)
{
$defaultOptions = parent::getDefaultOptions($options);
$defaultOptions['attr']['class'] = 'ckeditor';
return $defaultOptions;
}
}
|
Vous venez de déclarer le type
ckeditor (nom de l'alias). Ce type hérite de toutes les fonctionnalités d'un textarea (grâce à la méthode getParent()) tout en disposant de la classe CSS
ckeditor (définie dans la méthode getDefaultOptions()) vous permettant, en ajoutant CKEditor à votre site, de transformer vos textarea en éditeur WYSIWYG. Pour l'utiliser, modifiez vos FormType pour utiliser 'ckeditor' à la place de 'textarea'. Par exemple, dans notre ArticleType :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | <?php
namespace Sdz\BlogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('date')
->add('titre')
// On remplace simplement le type textarea par le type ckeditor
->add('contenu', 'ckeditor')
->add('pseudo')
->add('tags', 'collection', array(
'type' => new TagType,
'allow_add' => true,
'allow_delete' => true
));
}
public function getName()
{
return 'sdz_blogbundle_articletype';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Sdz\BlogBundle\Entity\Article',
);
}
}
|
Pour en savoir plus, vous pouvez regarder le fichier
vendor\symfony\src\Symfony\Component\Form\AbstractType.php.
Les autres tags
Il existe beaucoup d'autres tags. Vous pouvez trouver la liste des tags par défaut dans Symfony ici :
http://symfony.com/doc/2.0/reference/dic_tags.html, mais il faut savoir que cette liste n'est pas complète car d'autres bundles ajoutent leur propre tags

.
La liste officielle n'étant pas très pratique pour comprendre comment utiliser certains tags, je compte faire ici une liste avec une description plus détaillée de chacun d'entre eux

:
| Identifiant |
Description |
Exemple |
| templating.engine |
Ce tag indique à Symfony que votre classe permet d'utiliser un nouveau moteur de templates. Par exemple, Twig possède sa classe TwigEngine. Pour déclarer un moteur de templates, utilisez le tag templating.engine.
Vous devez ensuite créer votre classe Engine sur le modèle de l'interface EngineInterface |
Code : Autre1
2
3
4
5
| services:
templating.engine.your_engine_name:
class: Fully\Qualified\Engine\Class\Name
tags:
- { name: templating.engine } |
|
| templating.helper |
Utilise votre service en tant que Helper de vue. Un helper de vue est différent d'une extension Twig car il n'est utilisable que dans les templates PHP. Vous devez définir un alias pour utiliser ce dernier dans votre vue.
Une fois déclaré, vous pouvez accéder à votre helper ainsi : <?php $view['alias_name']; ?>, soit par exemple pour SdzAntispam : <?php $view['antispam']->isSpam(/* ... */); ?> |
Code : Autre1
2
3
4
5
| services:
templating.helper.your_helper_name:
class: Fully\Qualified\Helper\Class\Name
tags:
- { name: templating.helper, alias: alias_name } |
|
| routing.loader |
Utilise votre service en tant que classe de chargement de routes. Cette fonctionnalité permet d'ajouter le support de plus de formats de configuration de routes. Par exemple, il existe des loaders PhpFileLoader, XmlFileLoader et YamlFileLoader. Pour déclarer votre classe de chargement, utilisez le tag routing.loader.
Votre classe de chargement doit correspondre à l'interface ci-contre : |
Code : Autre1
2
3
4
5
| services:
routing.loader.your_loader_name:
class: Fully\Qualified\Loader\Class\Name
tags:
- { name: routing.loader } |
Interface :
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | <?php
interface RouterLoader
{
/**
* Charge les routes depuis une ressource.
* Cette méthode doit retourner une collection RouteCollection.
*
* @param mixed $string La ressource
* @param string $type Le type de ressource
*
* @return RouteCollection
*
* @api
*/
public function load($string, $type = null);
/**
* Cette méthode est utilisée pour savoir si le Loader est capable de charger la ressource.
*
* @param mixed $resource La ressource
* @param string $type Le type de ressource
*
* @return Boolean Retourne TRUE si il est possible d'utiliser ce Loader, FALSE sinon
*
* @api
*/
public function supports($string, $type = null);
}
|
|
| translation.loader |
Utilise votre service en tant que classe de chargement de traductions, sur le même principe que routing.loader. Cette fonctionnalité permet d'ajouter le support de plus de formats de configuration de traductions. Par exemple, il existe un loader YamlFileLoader. Pour déclarer votre classe de chargement, utilisez le tag translation.loader avec un alias qui doit correspondre à l'extension que peut comprendre votre loader.
Votre classe de chargement doit correspondre à l'interface LoaderInterface. |
Code : Autre1
2
3
4
5
| services:
routing.loader.your_loader_name:
class: Fully\Qualified\Loader\Class\Name
tags:
- { name: translation.loader, alias: ini } |
|