Laravel какая польза от поставщиков услуг для laravel

Я только начинаю работать с 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, но я просто не мог понять, в чем их польза и преимущества.

4 способа, которыми сервисный контейнер Laravel помогает нам управлять нашими зависимостями christoph-rumpel.com/2019/08/…

Goce Ribeski 03.09.2020 18:51
8
1
13 559
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Прежде всего, 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.

Он спрашивает об использовании поставщика услуг, а вы объясняете DI

AliN11 02.04.2020 09:15

Поставщики услуг для 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? ;)

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

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

Другие вопросы по теме