Laravel Какая польза от поставщиков услуг для Laravel - PullRequest
0 голосов
/ 26 октября 2018

Я только начинаю Laravel, и я действительно растерялся из-за service contains и service providers. Я искал несколько примеров, таких как код службы для подписки:

namespace App\Service;


class Tests
{
    public function test()
    {
        echo "aaa";
    }
}

Код поставщика услуг

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind('App\Service\Tests', function($app){
            return new \App\Service\Tests();
        });
    }
}

Затем я добавил этого провайдера в config/app,php -> providers Затем я создал контроллер

namespace App\Http\Controllers\test;

use App\Http\Controllers\Controller;
use App\Service\Tests as tests;

class Test extends Controller
{
    public function index()
    {
        $t = new tests();
        $t -> test();
    }
}

Итак, я могу использовать мой Tests вот так, почему мне нужно его использоватьпутем внедрения зависимости, например, на официальном сайте:

public function index(tests $test)
{
    $test->test();
}

Я видел какой-то документ или статью о DI и IoC, но я просто не мог понять, в чем польза и польза от этого

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Прежде всего, Laravel использует сервисный контейнер и поставщиков услуг , а не серверный контейнер или серверный провайдер :)

Вот несколько преимуществ использования внедрения зависимостей (DI):

Упрощение создания объекта

Поскольку класс конструктора класса Test довольно прост, вы не видите преимуществаВнедрение зависимостей.Подумайте о классе, подобном следующему:

class Complex {
    public function __construct(
        FooService $fooService,
        BarService $barService,
        int $configValue
    ) {

    }
}

Без DI вам нужно получить (или создать) экземпляры $fooService и $barService, извлечь значение $configValue из файлов конфигурации каждый раз вам нужен новый экземпляр класса Complex.

С помощью DI вы сообщаете сервисному контейнеру, как создать экземпляр Complex один раз, затем контейнер может дать правильный экземплярдля вас одним вызовом (например, $container->make(Complex::class))

Управление связями между вашими классами

Продолжите с предыдущим примером.Что произойдет, если FooService и BarService зависят и от других классов?

Без DI вам придется создавать экземпляры зависимых объектов (и надеяться, что они не зависят от других классов).Обычно это заканчивается созданием нескольких экземпляров одного класса, пустой тратой кодов и компьютерной памяти.

С DI все зависимые объекты создаются контейнером (вы должны зарегистрировать эти классы в контейнере раньше).Контейнер также диспетчер, чтобы сохранить только один экземпляр каждого класса, если вы хотите, что сохраняет объем кода, а также объем памяти, используемой вашей программой.

Используйте только один экземпляр ваших классов при регистрации вsingleton

Чтобы сохранить только один экземпляр класса во всей жизни текущего запроса, вы можете зарегистрировать процесс создания класса с помощью метода singleton вместо bind

0 голосов
/ 26 октября 2018

Поставщики услуг для laravel

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

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

Если вы откроете файл config / app.php, включенный в Laravel, вы увидите массив поставщиков.Это все классы поставщика услуг, которые будут загружены для вашего приложения.Конечно, многие из них являются «отложенными» поставщиками, то есть они будут загружаться не при каждом запросе, а только тогда, когда услуги, которые они предоставляют, действительно необходимы.

Представьте, что вы создали класс, который требует нескольких зависимостей ив общем, вы используете это так:

$foo = new Foo(new Bar(config('some_secret_key')), new Baz(new Moo(), new 
Boo()), new Woo('yolo', 5));

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

$this->app->singleton('My\Awesome\Foo', function ($app) {
   return new Foo(new Bar(config('some_secret_key')), new Baz(new Moo(), new 
   Boo()), new Woo('yolo', 5));
});

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

$foo = app(My\Awesome\Foo::class). Isn't that easier to use? ;)

ниже. Link поможет вам написать собственных поставщиков услуг, зарегистрировать их и использовать в приложении Laravel.

https://laravel.com/docs/5.7/providers

0 голосов
/ 26 октября 2018

Пожалуйста, ознакомьтесь с этим официальным документом laravel, чтобы поставщики услуг надеялись, что это поможет вам:

Поставщики услуг являются центральным местом всех загрузок приложений Laravel.

https://laravel.com/docs/5.7/providers

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