Поиск…
Вступление
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();
}
}
Вот почему следующий шаг - зарегистрировать свой сервис в контейнере сервисов . Когда вы регистрируете Сервис в контейнер услуг, вам не нужно создавать новый объект каждый раз, когда вам это нужно.
Чтобы зарегистрировать услугу в контейнере услуг, вам необходимо создать поставщика услуг . Этот поставщик услуг может:
- Зарегистрируйте свою службу в контейнере услуг с помощью метода регистрации )
- Внедрение других служб в вашу службу (зависимости) с помощью метода загрузки
Поставщик услуг - это класс, расширяющий абстрактный класс 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,
...
],
...
];
Теперь мы можем получить доступ к нашей службе в контроллере. Три возможности:
- Внедрение зависимости:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function __construct(OurService $our_service)
{
dd($our_service->getNumber());
}
}
- Доступ через помощник
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>