Sök…


Introduktion

Laravel ger tillgång till en mängd olika klasser som kallas tjänster. Vissa tjänster är tillgängliga utanför rutan, men du kan skapa dem själv.

En tjänst kan användas i flera filer i applikationen, som kontroller. Låt oss föreställa oss en tjänst OurService implementerar en getNumber() -metod som returnerar ett slumpmässigt nummer:

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

För att skapa en tjänst behövs det bara att skapa en ny klass:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

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

För närvarande kan du redan använda den här tjänsten i en controller, men du skulle behöva instansera ett nytt objekt varje gång du skulle behöva det:

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

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

Det är därför nästa steg är att registrera din tjänst i servicebehållaren . När du registrerar din tjänst i servicebehållaren behöver du inte skapa ett nytt objekt varje gång du behöver det.

För att registrera en tjänst i servicebehållaren måste du skapa en tjänsteleverantör . Denna tjänsteleverantör kan:

  1. Registrera din tjänst i servicebehållaren med registermetoden )
  2. Injicera andra tjänster i din tjänst (beroende) med startmetoden

En tjänsteleverantör är en klass som utvidgar den abstrakta klassen Illuminate\Support\ServiceProvider . Den måste implementera metoden register() för att registrera en tjänst i servicebehållaren :

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

Alla tjänsteleverantörer sparas i en matris i config/app.php . Så vi måste registrera vår tjänsteleverantör i denna grupp:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Vi kan nu komma åt vår tjänst i en controller. Tre möjligheter:

  1. Beroende på injektion:
<?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. Åtkomst via hjälpen för app() :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

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

Laravel tillhandahåller fasader, imaginära klasser som du kan använda i alla dina projekt och reflektera en tjänst. För att få åtkomst till din tjänst lättare kan du skapa en fasad:

<?php
namespace App\Http\Controllers;

use Randomisator;

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

}

För att skapa en ny fasad måste du skapa en ny klass som utvidgar Illuminate\Support\Facades\Facade . Denna klass måste implementera getFacadeAccessor() och returnera namnet på en tjänst registrerad av en tjänsteleverantör :

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

Du måste också registrera din fasad i config/app.php :

return [

    ...

    'aliases' => [

        ....

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

];

Fasaden är nu tillgänglig var som helst i ditt projekt.

Om du vill komma åt din tjänst från dina vyer kan du skapa en hjälpfunktion. Laravel-fartyg med vissa hjälpare fungerar utanför rutan, som auth() -funktionen eller view() -funktionen. Skapa en ny fil för att skapa en hjälpfunktion:

# app/Services/OurService/helpers.php    

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

Du måste också registrera den här filen, men i din composer.json fil:

{

    ...

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

        ...
    }
}

Du kan nu använda den här hjälpen i en vy:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow