Провайдер услуг
Поставщики услуг являются центральным местом всей начальной загрузки приложений Laravel. Ваше собственное приложение, а также все основные сервисы Laravel загружаются через сервис-провайдеров.
Таким образом, всякий раз, когда вы хотите внедрить сервис в другие сервисы, вы можете добавить его в конструктор или метод, и поставщик сервиса автоматически внедрит его из контейнера сервисов.
Давайте посмотрим на быстрый пример, чтобы понять это.
class MyDemoClass
{
public function __construct(AwesomeService $awesome_service)
{
$awesome_service->doAwesomeThing();
}
}
Сервисный контейнер
Я упрощу это на примере реального мира.
Предположим, ваше приложение требует PHP SDK Facebook для доступа к API Facebook, и ваш контроллер выглядит следующим образом:
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
use Facebook\Facebook;
class FacebookApiAccessController extends Controller
{
protected $facebook;
public function __construct(Facebook\Facebook $facebook)
{
$this->facebook = $facebook;
}
//.. action methods here
}
Теперь вам нужно указать Service Container, как создать экземпляр Facebook\Facebook
.
<?php
$container->singleton('Facebook\Facebook', function() {
return new \Facebook\Facebook([
'app_id' => config('services.facebook.app_id'),
'app_secret' => config('services.facebook.app_secret'),
'default_graph_version' => 'v2.10',
]);
});
Обратите внимание, я назвал метод «singleton» вместо «bind». Единственное отличие состоит в том, что службы, зарегистрированные с помощью «singleton», кэшируются, и последующие вызовы для разрешения службы возвращают кэшированные службы.
Наконец, я советую вам прочитать эту статью , чтобы понять и узнать
связь между сервисным контейнером, Dependency Injection и
Отражение.