Поиск…


Вступление

Laravel разрешает доступ к различным классам, называемым службами. Некоторые службы доступны из коробки, но вы можете создавать их самостоятельно.

Услуга может использоваться в нескольких файлах приложения, таких как контроллеры. Представим себе Service OurService реализующий метод getNumber() возвращающий случайное число:

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

Чтобы создать Сервис, необходимо создать новый класс:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

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

В настоящее время вы уже можете использовать эту службу в контроллере, но вам нужно будет создавать новый объект каждый раз, когда вам это понадобится:

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

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

Вот почему следующий шаг - зарегистрировать свой сервис в контейнере сервисов . Когда вы регистрируете Сервис в контейнер услуг, вам не нужно создавать новый объект каждый раз, когда вам это нужно.

Чтобы зарегистрировать услугу в контейнере услуг, вам необходимо создать поставщика услуг . Этот поставщик услуг может:

  1. Зарегистрируйте свою службу в контейнере услуг с помощью метода регистрации )
  2. Внедрение других служб в вашу службу (зависимости) с помощью метода загрузки

Поставщик услуг - это класс, расширяющий абстрактный класс Illuminate\Support\ServiceProvider . Ему необходимо реализовать метод register() для регистрации Сервиса в контейнере сервисов :

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

Все поставщики услуг сохраняются в массиве в config/app.php . Поэтому нам нужно зарегистрировать нашего поставщика услуг в этом массиве:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Теперь мы можем получить доступ к нашей службе в контроллере. Три возможности:

  1. Внедрение зависимости:
<?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. Доступ через помощник app() :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

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

Laravel предоставляет Фасады, воображаемые классы, которые вы можете использовать во всех своих проектах и ​​отражать Сервис. Чтобы облегчить доступ к вашему сервису, вы можете создать фасад:

<?php
namespace App\Http\Controllers;

use Randomisator;

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

}

Чтобы создать новый Facade, вам нужно создать новый класс, расширяющий Illuminate\Support\Facades\Facade . Этот класс должен реализовать метод getFacadeAccessor() и вернуть имя службы, зарегистрированной поставщиком услуг :

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

Вам также необходимо зарегистрировать свой Фасад в config/app.php :

return [

    ...

    'aliases' => [

        ....

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

];

Теперь Facade доступен в любом месте вашего проекта.

Если вы хотите получить доступ к своей службе из своих представлений, вы можете создать вспомогательную функцию. Laravel поставляется с некоторыми помощниками, функционирует из коробки, как функция auth() или функция view() . Чтобы создать вспомогательную функцию, создайте новый файл:

# app/Services/OurService/helpers.php    

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

Вам также необходимо зарегистрировать этот файл, но в файле composer.json :

{

    ...

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

        ...
    }
}

Теперь вы можете использовать этот помощник в представлении:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow