Les service providers sont un composant essentiel dans l'initialisation d'une application boostrap. Ils vont permettre d'enregistrer des "services" qui pourront ensuite être appelés dans le reste de l'application au travers de l'injection de dépendance ou en utilisant le conteneur directement.
Pour enregistrer un service il est possible de le déclarer dans la fonction register()
d'un service Provider.
public function register(): void
{
$this->app->singleton('weather', function (Application $app) {
return new WeatherApi(config('WEATHER_KEY'));
});
}
Une fois ce service enregistré on peut l'utiliser n'importe où dans l'application à l'aide de la méthode globale app()
.
app('weather') // WeatherApi{}
L'accès à un service va automatiquement instancier l'objet comme on l'a défini dans le provider.
Injection de dépendances
Il est aussi possible de définir le service en utilisant le nom de la classe plutôt qu'une chaîne de caractère arbitraire.
public function register(): void
{
$this->app->singleton(Weather::class, function (Application $app) {
return new WeatherApi(config('WEATHER_KEY'));
});
}
Cela permet ensuite de profiter de l'injection de dépendance. Lorsque Laravel va essayer d'instancier une classe il sera capable de regarder les dépendances nécessaire. Si une dépendance correspond à un service qu'il connait, il injectera automatiquement le service en question.
class UserController extends Controller
{
public function __construct(
private WeatherApi $weather,
) {}
}
Cela peut aussi être utilisé pour des composants du framework en remplacement des façades.
class UserController extends Controller
{
public function index(
private Illuminate\Auth\AuthManager $auth,
) {
$user = $auth->user();
// ...
}
}