Symfony

CRÉER UN SERVICE SYMFONY

D

Mercredi 25 octobre 2017

Créer un service Symfony

Pour créer un service, il faut suivre les étapes suivantes.

Il faut tout d'abord créer un fichier qui contiendra une classe qui sera votre service. Ce fichier, vous pouvez le créer où vous le voulez, dans un bundle réservé pour lui, dans un de vos bundles existant, peu importe. Pour ma part, je le crée dans src/AppBundle/Services/MyService.php et j'y insère le code suivant :
<?php

namespace AppBundle\Services;

class MyService
{
	/**
	* Retourne "true" si le premier argument fait plus de 10 caractères
	*
	* @param string $argument
	* @return bool
	*/
	public function myFunction($argument) {
		return strlen($text) > 10;
	}
}
Je n'oublie pas de respecter la convention de Symfony à propos des namespaces (la norme PSR-0) qui stipule que le namespace doit correspondre au chemin du fichier. Par exemple, si le fichier se trouve dans src/AppBundle/Services/MyService.php, alors mon namespace doit être AppBundle\Services.

Ensuite, créez le fichier src/AppBundle/Resources/config/services.yml et mettez-y le code suivant :
services:
    nom.de.mon.service:
        class: Namespace\de\ma\classe\MaClasse
Pour nous, ça sera :
services:
    app_bundle.my_service:
        class: AppBundle\Services\MyService


Plus qu'à l'utiliser dans nos contrôleurs :
<?php

// src/AppBundle/Controller/MyController.php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class MyController extends Controller
{
  public function myAction(Request $request)
  {
    // On récupère le service
    $my_service = $this->container->get('app_bundle.my_service');

    // Et on l'utilise
    $texte = 'Mon petit texte';
    if ($my_service->myFunction($texte)) {
      // $texte fait plus de 10 caractères
    }
    
  }
}


Commandes qui peut servir : Avoir la liste des services de son application :
php bin/console debug:container


Passer des arguments à ses services

Pour passer des arguments à ses services, c'est comme ceci :
Dans le fichier src/AppBundle/Resources/config/services.yml :
services:
    app_bundle.my_service:
        class: AppBundle\Services\MyService
        arguments:
            - "@mailer" # Un autre service, précédé d'un @
            - %locale% # Un paramètre, entouré de %
            - 50 # Une valeur toute bête, un nombre, un string, ou n'importe nawak !
Et dans le fichier src/AppBundle/Controller/MyController.php :
<?php

namespace AppBundle\Services;

class MyService
{
	private $mailer;
	private $locale;
	private $number;

	public function __construct(\Swift_Mailer $mailer, $locale, $number)
	{
		$this->mailer    = $mailer;
		$this->locale    = $locale;
		$this->number= (int) $number;
	}
	
	/**
	* Retourne "true" si le premier argument fait plus de 10 caractères
	*
	* @param string $argument
	* @return bool
	*/
	public function myFunction($argument) {
		return strlen($text) > 10;
	}
}

Une erreur ? une question ? une critique ? une faute ? un conseil ? ou tout simplement un merci ?

Lâche ton commentaire


taz59 Le lundi 27 juillet 2020 à 17:42:33
merci beaucoup pour cette revision