Laravel — мне нужен поставщик услуг для каждого из моих контейнеров услуг / пользовательских классов?

Сервисные контейнеры / провайдеры, вероятно, являются гораздо более простыми понятиями, чем я себе представляю, но после нескольких часов чтения я все еще не понимаю, полностью.

Я создал простой DateFormat класс в app/Library, После создания псевдонима для него внутри \config\app.php Я могу использовать его прямо сейчас в любых контроллерах или шаблонах блейдов.

<?php namespace App\Library;

class DateFormat {

public static function getDate($timestamp){
// processing the timestamp
}

}

Я только что создал сервисный контейнер? Если да, нужно ли мне также создавать поставщика услуг? Откуда появляются привязки на картинке?

Я был бы очень признателен за освещение этой темы.
Спасибо

4

Решение

Нет. То, что вы создали, это просто псевдоним вашего класса. Поставщики услуг являются способом привязки определенного класса и часто используются в сочетании с Фасад.

Псевдоним — это просто удобный способ использовать класс без необходимости каждый раз импортировать весь класс пространства имен.

Например, если у вас есть класс \My\Very\Long\Class\AdapterПсевдоним это в config/app.php:

// config/app.php
<?php
'aliases' => [
// a bunch of aliases
'MyAdapter' => My\Very\Long\Class\Adapter::class,
]

И теперь вы можете просто сделать:

<?php

new MyAdapter();
...

вместо:

<?php

use My\Very\Long\Class\Adapter;
...
new Adapter();
...

Поставщик услуг часто используется, когда вы хотите разрешить зависимость, чаще всего с помощью внедрения. Это может быть полезно, когда класс, который вы хотите разрешить, требует, чтобы параметры передавались в конструктор, или каждый раз имеет общую настройку. Вы можете выполнить все эти настройки в провайдере.

Вот сценарий:

У вас есть API, с которым вы хотите взаимодействовать. Мы назовем это SuperApi. В документах по SuperAPI говорится, что для создания экземпляра класса SuperApi необходимо сделать что-то вроде:

<?php
// Some method (a controller or something)
public function index()
{
$superApi = new \SuperApi\Connector($key, $secret);
return $superApi->getCustomers();
}

Теперь, каждый раз, когда вы хотите создать экземпляр этого, вам придется выполнять одну и ту же настройку (или абстрагировать ее для некоторого класса, но факт остается фактом, что вам нужно передать $key а также $secret конструктору).

Если бы вы создали псевдоним для этого Connector класс, может быть, это будет:

// config/app.php
<?php
'aliases' => [
// a bunch of aliases
'SuperApi' => SuperApi\Connector::class,
]

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

<?php

// Some method (a controller or something)
public function index()
{
$superApi = new SuperApi($key, $secret);
return $superApi->getCustomers();
}

Но вы видите, что даже с псевдонимом, вам все равно нужно передать $key а также $secret,

Здесь поставщик услуг может помочь.

// app/Providers/SuperApiProvider.php
<?php

namespace App\Providers;

use SuperApi\Connector;
use Illuminate\Support\ServiceProvider;

class SuperApiProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->bind('superApiConnector', function ($app) {
return new ApiConnector($app['config']->get('super-api.key'), $app['config']->get('super-api.secret'));
});
}
}

// app/Providers/SuperApi.php (the Facade)
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Facade;

class SuperApi extends Facade
{
protected static function getFacadeAccessor()
{
return 'superApiConnector';
}
}// config/super-api.config
<?php

return [
'key' => env('SUPER_API_KEY'),
'secret' => env('SUPER_API_SECRET'),
];

// config/app.php
<?php
'providers' => [
// a bunch of providers
App\Providers\SuperApiProvider::class,
]

Смотрите, что строка, которую вы связываете в провайдере ('superApiConnector') — это то же самое, что вы возвращаете с фасада, а имя класса фасада — это то, как вы на самом деле будете называть связанный класс, в этом случае SuperApi,

Теперь, когда вы хотите использовать SuperApi\Connector класс, вы можете сделать это:

<?php

// Some method (a controller or something)
public function index()
{
return SuperApi::getCustomers();
}

И, как я уже сказал выше, когда провайдер действительно пригодится, это когда вы хотите ввести его и иметь Контейнер IoC Laravel автоматически разрешить внедренный класс:

<?php
// Some method (a controller or something)
public function index(SuperApi $api)
{
return $api->getCustomers();
}

Чтобы было ясно, вам НЕ нужен поставщик услуг, чтобы воспользоваться преимуществами внедрения зависимостей. Пока класс может быть разрешен приложением, он может быть введен. Это означает, что любые аргументы, которые принимает конструктор класса, который вы вводите, также должны быть автоматически разрешаемыми.

9

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector