Chargement...

Les services Symfony


Un service Symfony est simplement une classe. Le choix de la création d'un service peut s'avérer utile quand il est nécessaire d'organiser des fonctionnalités. Les services sont rangés dans un conteneur accessible facilement dans les controlleurs.

Créer un simple service

Dans votre bundle, créez le dossier Services puis dans ce dossier, créez un fichier PHP (nous le nommerons Utils.php dans notre exemple)

namespace ENGEL\AwesomeBundle\Services;
class Utils
{
  public function getIp()
  {
    return "0.0.0.0";
  } 
}

Ensuite consultez le dossier DependencyInjection dans votre bundle et ouvrez le fichier BundleExtension, dans notre cas il se nomme: ENGELAwesomeBundleExtension.php

Assurez-vous de la présence des lignes de code:

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');

Ensuite éditez le fichier Resources/config/services.yml de votre bundle:

services:
  utils:
    class: ENGEL\AwesomeBundle\Services\Utils

Voila, nous avons indiqué à Symfony que notre classe Utils est un service

Nous pouvons maintenant appeler ce service depuis n'importe quel controlleur:

class MyController extends Controller
{
  public function indexAction()
  {
    $utils = $this->container->get('utils');
    return array( 'ip' => $utils->getIp() );
  }
}

Les arguments

Vous pouvez bien évidemment passer des paramètres comme ceci:

namespace ENGEL\AwesomeBundle\Services;
class Utils
{
  public function getIp($ip)
  {
    return $ip;
  } 
}
class MyController extends Controller
{
  public function indexAction()
  {
    $utils = $this->container->get('utils');
    return array( 'ip' => $utils->getIp("0.0.0.1") );
  }
}

Utiliser un service dans un service

Pour utiliser un service dans un service on peut utiliser l'injection de dépendances

namespace ENGEL\MeetGeekBundle\Services;

class Utils
{
  public function __construct($noutils)
  {
    $this->noutils = $noutils;
  }

  public function getIp($ip)
  {
    return $this->noutils->getName();
  } 
}

class NoUtils
{
  public function getName()
  {
    return "Olivier ENGEL";
  } 
}
services:
  utils:
    class: ENGEL\MeetGeekBundle\Services\Utils
    arguments: [@noutils]

  noutils:
    class: ENGEL\MeetGeekBundle\Services\NoUtils



UNE QUESTION SUR L'ARTICLE?


CSSW Apprendre à créer son site web CSSW