我们常常实例化一个类来使用其它的类,但这就造成了“依赖”。你的类依赖于另一个类。
当项目庞大,文件非常多的时候,各种类相互实例化,无数文件相互依赖,甚至有可能会出现循环依赖的情况。想象一下交通地图,或者三维的蜘蛛网,这种就称为高耦合。
Laravel为了降低耦合度,提供了一种思路,把所有的类都放到容器中,用的时候都到容器中来拿。于是,所有的类都只依赖于容器,依赖关系不再是繁杂的蜘蛛网。通过容器获取实例还有一个最直接的好处,因为容器可以返回一个“假的”实例,来模拟各种情况,大大方便测试。
laravel开局便创建了一个容器,以后所有的类都是从容器中取出的。
为了避免多人同时修改同一个文件向容器注册类,laravel将注册地点分成多个文件,这就是服务提供者。我们可以在服务提供者的register
方法中向容器注册类。
$this->app->bind('A', A::class);
//单例模式
$this->app->singleton('A', A::class);
如果你有非常多的类需要注册的话,可以用bindings
和singletons
属性:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\A;
use App\Services\B;
class AppServiceProvider extends ServiceProvider
{
/**
* 设定所有的容器绑定的对应关系
*
* @var array
*/
public $bindings = [
'A' => A::class,
];
/**
* 设定所有的单例模式容器绑定的对应关系
*
* @var array
*/
public $singletons = [
'B' => B::class,
];
}
$api = $this->app->make('A');
$api = resolve('A');
依赖注入,自动解析:
<?php
namespace App\Http\Controllers;
use App\Users\A as A;
class UserController extends Controller
{
public function index(A $users)
{
//
}
}