Ricerca…


introduzione

Laravel consente l'accesso a una varietà di classi chiamate Servizi. Alcuni servizi sono disponibili immediatamente, ma è possibile crearli da soli.

Un servizio può essere utilizzato in più file dell'applicazione, come i controller. Immaginiamo un servizio OurService implementa un metodo getNumber() restituendo un numero casuale:

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

Per creare un servizio, è necessario solo creare una nuova classe:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

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

A questo punto, potresti già utilizzare questo servizio in un controller, ma dovresti creare un'istanza di un nuovo oggetto ogni volta che ne hai bisogno:

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

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

Questo è il motivo per cui il prossimo passo è registrare il tuo servizio nel Service Container . Quando registri il servizio nel contenitore del servizio, non è necessario creare un nuovo oggetto ogni volta che ne hai bisogno.

Per registrare un servizio nel contenitore del servizio, è necessario creare un fornitore di servizi . Questo fornitore di servizi può:

  1. Registra il tuo servizio nel contenitore di servizio con il metodo di registrazione )
  2. Iniezione di altri servizi nel servizio (dipendenze) con il metodo di avvio

Un fornitore di servizi è una classe che estende la classe astratta Illuminate\Support\ServiceProvider . È necessario implementare il metodo register() per registrare un servizio nel Service Container :

# 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();
        });
    }
}

Tutti i fornitori di servizi sono salvati in un array in config/app.php . Quindi abbiamo bisogno di registrare il nostro fornitore di servizi in questo array:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Ora possiamo accedere al nostro servizio in un controller. Tre possibilità:

  1. Iniezione di dipendenza:
<?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. Accesso tramite l'helper app() :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

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

Laravel fornisce facciate, classi immaginarie che puoi usare in tutti i tuoi progetti e riflettere un servizio. Per accedere più facilmente al tuo servizio, puoi creare una facciata:

<?php
namespace App\Http\Controllers;

use Randomisator;

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

}

Per creare una nuova facciata, è necessario creare una nuova classe che estende Illuminate\Support\Facades\Facade . Questa classe deve implementare il metodo getFacadeAccessor() e restituire il nome di un servizio registrato da un fornitore di servizi :

# 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';
    }
}

Devi anche registrare la tua facciata in config/app.php :

return [

    ...

    'aliases' => [

        ....

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

];

The Facade è ora accessibile ovunque nel tuo progetto.

Se si desidera accedere al servizio dalle proprie visualizzazioni, è possibile creare una funzione di supporto. Laravel viene fornito con alcuni helper che funzionano fuori dalla scatola, come la funzione auth() o la funzione view() . Per creare una funzione di supporto, crea un nuovo file:

# app/Services/OurService/helpers.php    

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

Devi anche registrare questo file, ma nel tuo file composer.json :

{

    ...

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

        ...
    }
}

Ora puoi usare questo helper in una vista:

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow