Articles

Fournisseurs de services à Laravel : qu'est-ce qu'ils sont et comment utiliser les fournisseurs de services à Laravel ?

Les fournisseurs de services Laravel constituent le lieu central de démarrage de l'application. Autrement dit, les services de base de Laravel et les services d'application, les classes et leurs dépendances sont placés dans le conteneur de services via les fournisseurs. 

En d'autres termes, les prestataires de services sont comme un entonnoir par lequel on verse du carburant "de classe" dans un réservoir appelé le "conteneur de service" d'un moteur appelé Laravel.

Exemple

Si nous ouvrons config/app.php nous verrons un tableau avec le nom "provider"

'providers' => [

        /*
        * Laravel Framework Service Providers...
        */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        .
        .
        .
],

Voici quelques-uns des fournisseurs de services fournis avec laravel, c'est-à-dire des services de base placés dans le conteneur de services.

Quand je service provider sont-ils exécutés ?

Si nous regardons la documentation cycle de vie sur demande , les fichiers suivants sont exécutés au démarrage :

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php et son Middlewares
  • Service Providers: contenu de cet article

qui service provider sont-ils chargés ? 

Ce sont ceux definites dans le tableau config/app.php:

return [
 
    // ... other configuration values
 
    'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
 
        // ... other framework providers from /vendor
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * PUBLIC Service Providers - the ones we mentioned above
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
    ],
 
];

Comme nous pouvons le voir, il existe une liste de service provider non public dans le dossier /vendor, nous ne devons ni les toucher ni les modifier. Ceux qui nous intéressent sont ci-dessous, avec BroadcastServicerProvider désactivé par défaut, probablement parce qu'il est rarement utilisé.

Tous ces fournisseurs de services fonctionnent de haut en bas, répétant la liste deux fois:

  • La première itération recherche une méthode optionnelle register(), utile pour (éventuellement) exécuter quelque chose de configuré avant la méthode boot().
  • la deuxième itération exécute la méthode boot() de tous les prestataires. Encore une fois, un par un, de haut en bas, du tableau 'providers'.
  • Enfin, une fois que tous les fournisseurs de services ont été traités, Laravel passe à l'analyse du chemin (route), à ​​l'exécution du contrôleur, à l'utilisation de modèles, etc.

Fournisseurs de services Laravel prédefini

I Service Providers inclus dans Laravel, sont tous ceux présents dans le dossier app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Ce sont toutes des classes PHP, chacune liée à son propre sujet : App, Auth, Broadcasting, Events e Routes. Mais ils ont tous un point commun : la méthode boot().

Dans cette méthode, nous pouvons écrire n'importe quel code lié à l'une de ces sections : auth, events, route, etc. En d'autres termes, les fournisseurs de services ne sont que des classes pour enregistrer certaines fonctionnalités globales.

Ils sont séparés en tant que "fournisseurs" car ils s'exécutent très tôt dans le cycle de vie de l'application, donc quelque chose de global est pratique ici avant que le script en cours d'exécution n'atteigne les modèles ou les contrôleurs.

La plupart des fonctionnalités sont dans le RouteServiceProvider, voici le code :

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
 
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

C'est la classe où les fichiers sont configurés routeavec routes/web.phproutes/api.php inclus par défautdefinita. Notez que pour l'API, il existe également différentes configurations : Préfixe du point de terminaison /api et middleware api pour tous routes.

Nous pouvons éditer le service providers, qui ne se trouvent pas dans le dossier /vendor. La personnalisation de ces fichiers est effectuée lorsque vous avez de nombreux chemins et que vous souhaitez les séparer en fichiers spécifiques. Tu crées routes/auth.php et y mettre les chemins, puis vous "activez" ce fichier dans la méthode boot() di RouteServiceProvider, ajoutez simplement la troisième phrase :

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider c'est vide. Un exemple typique d'ajout de code AppServiceProvider, consiste à désactiver le chargement paresseux dans Eloquent . Pour ce faire, il vous suffit ajouter deux lignes dans la méthode boot():

Bulletin d'innovation
Ne manquez pas les nouvelles les plus importantes sur l'innovation. Inscrivez-vous pour les recevoir par email.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Cela lèvera une exception si un modèle de relation n'est pas chargé.

Créez votre propre service provider coutume

En plus des préfichiersdefinis, nous pouvons facilement en créer un nouveau Service Provider, liés à d'autres sujets que ceux prédefiterminé comme auth/event/routes.

Un exemple assez typique est la configuration de la vue Blade. Nous pouvons créer une directive Blade, puis ajoutez ce code dans la méthode boot() de toute service provider, y compris la valeur par défaut AppServiceProvider. Créons maintenant un ViewServiceProvider séparé.

Nous pouvons le générer avec cette commande :

php artisan make:provider ViewServiceProvider

Qui générera la classe si prédefifini :

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Comme nous pouvons le voir à l'intérieur, il existe deux méthodes :

La méthode register()

La méthode register() nous permet de defiTerminez les liens vers notre conteneur de services. Par exemple, dans le code suivant :

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app est une variable globale dans laravel à laquelle une classe singleton peut accéder via l'application.

Singleton est une fonctionnalité. Lors de l'application de cette fonctionnalité, nous informons l'application que la classe transmise en tant que paramètre dans l'application ne doit avoir qu'une seule instance dans l'ensemble de l'application. Cela signifie que MyClass sera résolu une fois et n'aura qu'une seule instance, accessible à l'aide de la variable my_class.

La méthode boot()

La méthode boot() vous permet d'accéder à tous les services précédemment enregistrés à l'aide de la méthode register. Vous pouvez ensuite inclure l'intégralité du service dans votre application à l'aide de cette méthode.

Revenant à l'exemple précédent, supprimons la méthode register() et dans boot() ajoutez le code de la directive Blade :

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Un autre exemple de ViewServiceProvider ce qui concerne View Composers, voici l'extrait du site officiel de Laravel :

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Using class based composers...
        View::composer('profile', ProfileComposer::class);
 
        // Using closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

Pour s'exécuter, ce nouveau fournisseur doit être ajouté/enregistré dans le tableau du fournisseur config/app.php:

return [
    // ... other configuration values
 
    'providers' => [
 
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
        // Add your provider here
        App\Providers\ViewServiceProvider::class,
    ],
];

Ercole Palmeri

Ils pourraient également être intéressés par:

Bulletin d'innovation
Ne manquez pas les nouvelles les plus importantes sur l'innovation. Inscrivez-vous pour les recevoir par email.

Articles récents

Comment organiser au mieux les données et les formules dans Excel, pour une analyse bien faite

Microsoft Excel est l'outil de référence en matière d'analyse de données, car il propose de nombreuses fonctionnalités pour organiser des ensembles de données,…

14 mai 2024

Conclusion positive pour deux projets importants de Walliance Equity Crowdfunding : Jesolo Wave Island et Milano Via Ravenna

Walliance, SIM et plateforme parmi les leaders en Europe dans le domaine du Crowdfunding Immobilier depuis 2017, annonce la finalisation…

13 mai 2024

Qu'est-ce que le filament et comment utiliser le filament Laravel

Filament est un framework de développement Laravel « accéléré », fournissant plusieurs composants full-stack. Il est conçu pour simplifier le processus de…

13 mai 2024

Sous le contrôle des Intelligences Artificielles

«Je dois revenir pour achever mon évolution : je vais me projeter à l'intérieur de l'ordinateur et devenir une pure énergie. Une fois installé…

10 mai 2024

La nouvelle intelligence artificielle de Google peut modéliser l'ADN, l'ARN et « toutes les molécules de la vie »

Google DeepMind présente une version améliorée de son modèle d'intelligence artificielle. Le nouveau modèle amélioré offre non seulement…

9 mai 2024

Explorer l'architecture modulaire de Laravel

Laravel, célèbre pour sa syntaxe élégante et ses fonctionnalités puissantes, constitue également une base solide pour l'architecture modulaire. Là…

9 mai 2024

Cisco Hypershield et acquisition de Splunk La nouvelle ère de la sécurité commence

Cisco et Splunk aident leurs clients à accélérer leur transition vers le centre d'opérations de sécurité (SOC) du futur avec…

8 mai 2024

Au-delà du côté économique : le coût peu évident des ransomwares

Les ransomwares ont dominé l’actualité ces deux dernières années. La plupart des gens savent bien que les attaques…

6 mai 2024