我只是Laravel的入门者,我对service contains
和service 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的文档或文章,但是,我只是不明白它的用途和好处
答案 0 :(得分:0)
答案 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)
)为您提供正确的实例
继续前面的示例。如果FooService
和BarService
也依赖于其他类会发生什么?
没有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应用程序一起使用。