Laravel 5.7 (сервисный контейнер и сервисный провайдер) - PullRequest
0 голосов
/ 03 января 2019

Нужно понять контейнер услуг laravel и поставщика услуг через пример. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Здравствуйте и добро пожаловать в stackoverflow!

Сервисный контейнер - это место, в котором хранится наше приложение bindings. И поставщики услуг - это классы, в которых мы регистрируем наши привязки для контейнера служб . В более старых выпусках Laravel у нас не было этих провайдеров, и люди всегда спрашивали, куда поместить привязки. И ответ был запутанным. «Где это имеет смысл». Затем Laravel представила каталог поставщиков услуг и Providers , чтобы прояснить ситуацию для людей.

Чтобы было легче понять, я приведу простой пример:

interface AcmeInterface {
    public function sayHi();
}

class AcmeImplementation implements AcmeInterface {
    public function sayHi() {
        echo 'Hi!';
    }
}

// Service Container
$app = new \Illuminate\Database\Container;

// Some required stuff that are also service providing lines 
// for app config and app itself.

$app->singleton('app', 'Illuminate\Container\Container');
$app->singleton('config', 'Illuminate\Config\Repository');

// Our Example Service Provider
$app->bind(AcmeInterface::class, AcmeImplementation::class);

// Example Usage:
$implementation = $app->make(AcmeInterface::class);
$implementation->sayHi();

Как видите;

  • Сначала мы создаем контейнер (В реальной жизни Laravel делает это для нас внутри bootstrap/app.php),
  • Затем мы регистрируем наш сервис (внутри нашего поставщика услуг классов и config/app.php),
  • и, наконец, мы получаем и используем наш зарегистрированный сервис. (внутри контроллеры, модели, сервисы ..)
0 голосов
/ 03 января 2019

Провайдер услуг

Поставщики услуг являются центральным местом всей начальной загрузки приложений 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 и Отражение.

0 голосов
/ 03 января 2019

Сервисный контейнер - это место, где регистрируются ваши услуги.

Поставщики услуг предоставляют услуги, добавляя их в контейнер.

По ссылке Laracast .Будьте внимательны, чтобы понять.

Сервисный контейнер : https://laracasts.com/series/laravel-from-scratch-2017/episodes/24

Поставщики услуг : https://laracasts.com/series/laravel-from-scratch-2017/episodes/25

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...