Laravel laravel服务提供者有什么用

时间:2018-10-26 02:45:47

标签: php laravel

我只是Laravel的入门者,我对service containsservice providers感到困惑,我搜索了以下示例,例如follow的服务代码:

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 :(得分:0)

请查看此laravel官方文档,以获取服务提供商的希望对您有帮助:

  

服务提供商是所有Laravel应用程序的中心   自举。

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

答案 1 :(得分:0)

首先,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))为您提供正确的实例

管理班级之间的联系

继续前面的示例。如果FooServiceBarService也依赖于其他类会发生什么?

没有DI,您必须创建依赖对象的实例(并希望它们不依赖于其他类)。这通常以创建一个类的多个实例结束,浪费了代码和计算机内存。

使用DI,所有相关对象都由容器创建(您必须在容器之前注册这些类)。容器还管理器,如果需要,每个类仅保留一个实例,这样可以节省代码量以及程序使用的内存量。

singleton注册时仅使用类的一个实例

要在当前请求的整个生命周期中仅保留类的一个实例,可以使用singleton方法而不是bind来注册类创建过程

答案 2 :(得分:0)

laravel服务提供商

服务提供者是所有Laravel应用程序引导的中心位置。您自己的应用程序以及Laravel的所有核心服务都是通过服务提供商引导的。

但是,“引导”是什么意思?通常,我们的意思是注册内容,包括注册服务容器绑定,事件监听器,中间件,甚至路由。服务提供商是配置您的应用程序的中心位置。

如果打开Laravel附带的config / app.php文件,您将看到一个provider数组。这些都是将为您的应用程序加载的所有服务提供程序类。当然,其中许多都是“延迟的”提供程序,这意味着它们不会在每个请求上都加载,而只是在实际需要它们提供的服务时才加载。

想象一下,您创建了一个需要多个依赖项的类,通常,您可以像这样使用它:

$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