php - laravel 服务提供者对 laravel 有什么用

标签 php laravel

我刚刚开始使用 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然后我创建一个 Controller
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像这样,为什么我需要像官方网站一样通过依赖注入(inject)来使用它:
public function index(tests $test)
{
    $test->test();
}

我看过一些关于 DI 和 IoC 的文档或文章,但是,我就是不明白它的用途和好处

最佳答案

首先,Laravel 使用服务容器和服务提供者,而不是服务器容器或服务器提供者 :)
以下是使用依赖注入(inject) (DI) 的一些好处:
简化对象创建
因为您的Test类构造函数非常简单,你看不到依赖注入(inject)的好处。想想这样一个类:

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

    }
}
如果没有 DI,您必须获取(或创建)$fooService 的实例和 $barService , 检索 $configValue 的值来自配置文件每次您想要 Complex 的新实例类(class)。
使用 DI,您告诉服务容器如何创建 Complex实例一次,然后容器可以通过一次调用为您提供正确的实例(例如 $container->make(Complex::class) )
管理类之间的耦合
继续前面的例子。如果 FooService 会发生什么?和 BarService也依赖于其他类?
如果没有 DI,您必须创建依赖对象的实例(并希望它们不依赖于其他类)。这通常以创建一个类的多个实例而结束,浪费代码和计算机内存。
使用 DI,所有依赖对象都由容器创建(您必须先向容器注册这些类)。如果需要,容器还设法只保留每个类的一个实例,这样可以节省代码量以及程序使用的内存量。
singleton 注册时只使用你的类的一个实例
要在当前请求的整个生命周期中只保留一个类的实例,您可以使用 singleton 注册您的类创建过程。方法而不是 bind

关于php - laravel 服务提供者对 laravel 有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53000712/

相关文章:

php - 包含内部函数被认为是不好的做法吗?

php - Laravel excel 传递 View

laravel - 当用户未经身份验证时,如何防止 Laravel 设置 session cookie?

mysql - 使用 laravel Eloquent 查询中的 Join 和 OrderBy

php - 使用 AND 选择语句

javascript - 根据包含其他两个输入之和的一个字段添加动态输入

php - 正则表达式在测试文件中工作,而不是在程序中工作(HTTP 原始响应)

php - 如果项目已经存在,如何重写相同的mysql表行?

mysql - Laravel - 获取多个 withCount() 的总和

php - Blueprint 类的 timestamp() 和 dateTime() 方法之间的区别