Service Container & Service Provider

Voir la vidéo
Description Sommaire

Avant d'aller plus loin dans cette formation je vous propose de faire le point sur le service container et le service provider.

Service Container

Le Service Container est un outil qui permet de gérer les dépendances et les injections dans nos classes. Si vous cherchez plus d'information sur le fonctionnement d'un conteneur vous pouvez vous rendre sur ce chapitre de la formation POO.

Le conteneur va permettre d'indiquer au framework comment instancier une classe.

App::bind('MaClass', function(){
    return new MaClass();
});

// si on souhaite ensuite récupérer une instance de MaClass
$maclass = App::make('MaClass'); 

Une des spécificités de ce container est sa capacité à résoudre les classes de manière automatique. En effet, si aucune fonction n'a été enregistrée pour définir notre dépendance le framework tentera de construire l'objet tout seul en y injectant les dépendance de manière automatique si le constructeur en demande.

Enfin il est aussi possible d'associer une implémentation à une interface.

App::bind('CacheInterface', 'MemcacheCache'); 

Service Provider

Les services provider permettent d'enregistrer de nouveaux éléments dans notre service container mais aussi d'ajouter une logique au démarrage (boot()) de notre application. Pour générer un nouveau service provider il vous suffit d'utiliser artisan.

php artisan make:provider MonSuperServiceProvider

Puis il faudra l'ajouter à la liste de nos services provider dans le fichier de configuration app.php de notre application.

Les Facades

Les facades sont un raccourci vers notre container et permettent un accès plus rapide à nos objets.

// Toutes ces méthodes sont équivalentes
Request::all();
App::make('request')->all();
app('request')->all();

Les Facades permettent d'appeler le Service Container à travers une classe static.

namespace Grafikart\Facades;
use Illuminate\Support\Facades\Facade;

class Car extends Facade {

    protected static function getFacadeAccessor()       { 
        // On retourne ici l'alias de l'IOC Container
        return 'car'; 
    }

}

Ce qui me permet d'avoir une syntaxe static

Grafikart\Facades\Car::maMethode();

Si vous souhaitez simplifier cet appel sans utiliser le namespace vous pouvez définir un alias dans votre fichier config/app.php.

"aliases" => array(
    ...
    "Car" => "Grafikart\Facades\Car"
}

Et on pourra alors faire

Car::maMethode();
Publié
Technologies utilisées
Auteur :
Grafikart
Partager