【问题标题】:Laravel What is the use of service providers for laravelLaravel 服务提供者对 laravel 有什么用
【发布时间】:2019-03-30 17:47:19
【问题描述】:

我刚刚开始使用 Laravel,我真的很困惑 service containsservice 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 的文档或文章,但是我就是不明白它的用途和好处

【问题讨论】:

标签: php laravel


【解决方案1】:

首先,Laravel 使用 service containerservice providers,而不是 server containerserver provider : )

以下是使用依赖注入 (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 注册您的类创建过程

【讨论】:

  • 他要求使用服务提供商,而您正在解释 DI
【解决方案2】:

laravel 的服务提供者

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

但是,我们所说的“自举”是什么意思?一般来说,我们的意思是注册事物,包括注册服务容器绑定、事件监听器、中间件,甚至路由。服务提供商是配置您的应用程序的中心位置。

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

假设您创建了一个需要多个依赖项的类,一般来说,您可以这样使用它:

$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));
});

这样,如果你需要使用这个类,你可以在控制器中输入hint它(容器会计算出来)或者像手动请求它

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

下面的链接将指导您如何编写自己的服务提供商并注册它们 并与您的 Laravel 应用程序一起使用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2015-10-24
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2019-05-29
    相关资源
    最近更新 更多