我刚刚开始使用 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
然后我创建一个 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/