Recherche…


introduction

Laravel permet d'accéder à une variété de classes appelées Services. Certains services sont disponibles immédiatement, mais vous pouvez les créer vous-même.

Un service peut être utilisé dans plusieurs fichiers de l'application, comme les contrôleurs. Imaginons un Service OurService implémentant une méthode getNumber() renvoyant un nombre aléatoire:

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        return app(OurService::class)->getNumber();
    }
}

Pour créer un service, il suffit de créer une nouvelle classe:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

class OurService 
{
    public function getNumber()
    {
        return rand();
    }
}

Pour le moment, vous pouvez déjà utiliser ce service dans un contrôleur, mais vous devrez instancier un nouvel objet chaque fois que vous en aurez besoin:

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }

    public function getOtherRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }
}

C'est pourquoi l'étape suivante consiste à enregistrer votre service dans le conteneur de services . Lorsque vous enregistrez votre service dans le conteneur de service, vous n'avez pas besoin de créer un nouvel objet chaque fois que vous en avez besoin.

Pour enregistrer un service dans le conteneur de services, vous devez créer un fournisseur de services . Ce fournisseur de services peut:

  1. Enregistrez votre service dans le conteneur de services avec la méthode register )
  2. Injection d'autres services dans votre service (dépendances) avec la méthode de démarrage

Un fournisseur de services est une classe qui étend la classe abstraite Illuminate\Support\ServiceProvider . Il doit implémenter la méthode register() pour enregistrer un service dans le conteneur de services :

# app/Services/OurService/OurServiceServiceProvider.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\ServiceProvider;

class OurServiceServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('OurService', function($app) {
            return new OurService();
        });
    }
}

Tous les fournisseurs de services sont enregistrés dans un tableau dans config/app.php . Nous devons donc enregistrer notre fournisseur de services dans ce tableau:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Nous pouvons maintenant accéder à notre service dans un contrôleur. Trois possibilités:

  1. Injection de dépendance:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function __construct(OurService $our_service)
    {
        dd($our_service->getNumber());
    }
}
  1. Accès via l’ app() :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return app('OurService')->getNumber();
    }
}

Laravel fournit des façades, des classes imaginaires que vous pouvez utiliser dans tous vos projets et refléter un service. Pour accéder plus facilement à votre service, vous pouvez créer une façade:

<?php
namespace App\Http\Controllers;

use Randomisator;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return Randomisator::getNumber();
    }

}

Pour créer une nouvelle façade, vous devez créer une nouvelle classe étendant Illuminate\Support\Facades\Facade . Cette classe doit implémenter la méthode getFacadeAccessor() et renvoyer le nom d'un service enregistré par un fournisseur de services :

# app/Services/OurService/OurServiceFacade.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\Facades\Facade;

class OurServiceFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'OurService';
    }
}

Vous devez également enregistrer votre façade dans config/app.php :

return [

    ...

    'aliases' => [

        ....

        'Randomisator' => App\Services\OurService\OurServiceFacade::class,
    ],

];

La façade est maintenant accessible partout dans votre projet.

Si vous souhaitez accéder à votre service depuis vos vues, vous pouvez créer une fonction d'assistance. Laravel est livré avec des fonctions d'aide telles que la fonction auth() ou la fonction view() . Pour créer une fonction d'assistance, créez un nouveau fichier:

# app/Services/OurService/helpers.php    

if (! function_exists('randomisator')) {
    /**
     * Get the available OurService instance.
     *
     * @return \App\ElMatella\FacebookLaravelSdk
     */
    function randomisator()
    {
        return app('OurService');
    }
}

Vous devez également enregistrer ce fichier, mais dans votre fichier composer.json :

{

    ...

    "autoload": {
        "files": [
            "app/Services/OurService/helpers.php"
        ],

        ...
    }
}

Vous pouvez maintenant utiliser cet assistant dans une vue:

<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow