Zoeken…


Invoering

Laravel geeft toegang tot verschillende klassen die Services worden genoemd. Sommige services zijn standaard beschikbaar, maar u kunt ze zelf maken.

Een service kan in meerdere bestanden van de toepassing worden gebruikt, zoals controllers. Laten we ons voorstellen a Service OurService uitvoering van een getNumber() methode het terugsturen van een willekeurig getal:

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

Om een service te maken, is het alleen nodig om een nieuwe klasse te maken:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

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

Op dit moment zou je deze service al in een controller kunnen gebruiken, maar je zou elke keer dat je het nodig hebt een nieuw object moeten instantiëren:

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

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

Daarom is de volgende stap het registreren van uw service in de Service Container . Wanneer u uw Service in de Service Container registreert, hoeft u niet elke keer een nieuw object te maken.

Als u een service in de servicecontainer wilt registreren, moet u een serviceprovider maken . Deze dienstverlener kan:

  1. Registreer uw service in de servicecontainer met de registratiemethode )
  2. Andere services in uw service injecteren (afhankelijkheden) met de opstartmethode

Een serviceprovider is een klasse die de abstracte klasse Illuminate\Support\ServiceProvider uitbreidt. Het moet de methode register() implementeren om een service in de servicecontainer te registreren :

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

Alle serviceproviders worden opgeslagen in een array in config/app.php . Daarom moeten we onze serviceprovider in deze array registreren:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

We hebben nu toegang tot onze Service via een controller. Drie mogelijkheden:

  1. Afhankelijkheid injectie:
<?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. Toegang via de app() helper:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

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

Laravel biedt gevels, denkbeeldige klassen die u in al uw projecten kunt gebruiken en die een service weergeven. Om gemakkelijker toegang te krijgen tot uw service, kunt u een gevel maken:

<?php
namespace App\Http\Controllers;

use Randomisator;

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

}

Als u een nieuwe gevel wilt maken, moet u een nieuwe klasse maken met de uitbreiding Illuminate\Support\Facades\Facade . Deze klasse moet de methode getFacadeAccessor() implementeren en de naam retourneren van een service die is geregistreerd door een serviceprovider :

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

U moet ook uw gevel registreren in config/app.php :

return [

    ...

    'aliases' => [

        ....

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

];

De gevel is nu overal in uw project toegankelijk.

Als u vanuit uw weergaven toegang wilt krijgen tot uw service, kunt u een helperfunctie maken. Laravel wordt geleverd met enkele helpers-functie uit de doos, zoals de auth() -functie of de view() -functie. Maak een nieuw bestand aan om een helpfunctie te maken:

# app/Services/OurService/helpers.php    

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

U moet dit bestand ook registreren, maar in uw composer.json bestand:

{

    ...

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

        ...
    }
}

U kunt deze helper nu in een weergave gebruiken:

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow