Szukaj…


Wprowadzenie

Laravel umożliwia dostęp do różnych klas zwanych usługami. Niektóre usługi są dostępne od razu po wyjęciu z pudełka, ale możesz je utworzyć samodzielnie.

Z usługi można korzystać w wielu plikach aplikacji, takich jak kontrolery. Wyobraźmy sobie usługę Service OurService implementującą getNumber() zwracającą liczbę losową:

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

Aby utworzyć usługę, wystarczy utworzyć nową klasę:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

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

W tej chwili możesz już korzystać z tej usługi w kontrolerze, ale za każdym razem będziesz potrzebować utworzyć nowy obiekt:

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

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

Dlatego następnym krokiem jest zarejestrowanie usługi w kontenerze usług . Po zarejestrowaniu usługi w kontenerze usług nie trzeba tworzyć nowego obiektu za każdym razem, gdy jest to potrzebne.

Aby zarejestrować usługę w kontenerze usług, musisz utworzyć usługodawcę . Ten usługodawca może:

  1. Zarejestruj swoją usługę w kontenerze usług przy użyciu metody rejestracji )
  2. Wstrzykiwanie innych usług do usługi (zależności) za pomocą metody rozruchu

Usługodawca to klasa rozszerzająca klasę abstrakcyjną Illuminate\Support\ServiceProvider . Musi zaimplementować metodę register() , aby zarejestrować usługę w kontenerze usług :

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

Wszyscy dostawcy usług są zapisani w tablicy w config/app.php . Musimy więc zarejestrować naszego usługodawcę w tej tablicy:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Możemy teraz uzyskać dostęp do naszej usługi w kontrolerze. Trzy możliwości:

  1. Wstrzykiwanie zależności:
<?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. Dostęp poprzez pomocnika app() :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

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

Laravel zapewnia Fasady, wyimaginowane klasy, które można wykorzystać we wszystkich swoich projektach i odzwierciedlają Usługę. Aby łatwiej uzyskać dostęp do usługi, możesz utworzyć fasadę:

<?php
namespace App\Http\Controllers;

use Randomisator;

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

}

Aby utworzyć nową fasadę, musisz utworzyć nową klasę rozszerzającą Illuminate\Support\Facades\Facade . Ta klasa musi implementować getFacadeAccessor() i zwracać nazwę usługi zarejestrowanej przez dostawcę usług :

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

Musisz także zarejestrować swoją fasadę w config/app.php :

return [

    ...

    'aliases' => [

        ....

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

];

Fasada jest teraz dostępna w dowolnym miejscu w projekcie.

Jeśli chcesz uzyskać dostęp do usługi z poziomu widoków, możesz utworzyć funkcję pomocnika. Laravel jest dostarczany z niektórymi funkcjami pomocniczymi po wyjęciu z pudełka, takimi jak funkcja auth() lub funkcja view() . Aby utworzyć funkcję pomocnika, utwórz nowy plik:

# app/Services/OurService/helpers.php    

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

Musisz także zarejestrować ten plik, ale w pliku composer.json :

{

    ...

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

        ...
    }
}

Możesz teraz używać tego pomocnika w widoku:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow