Laravel的核心 —— 服务容器

我们常常实例化一个类来使用其它的类,但这就造成了“依赖”。你的类依赖于另一个类。

当项目庞大,文件非常多的时候,各种类相互实例化,无数文件相互依赖,甚至有可能会出现循环依赖的情况。想象一下交通地图,或者三维的蜘蛛网,这种就称为高耦合。

image

Laravel为了降低耦合度,提供了一种思路,把所有的类都放到容器中,用的时候都到容器中来拿。于是,所有的类都只依赖于容器,依赖关系不再是繁杂的蜘蛛网。通过容器获取实例还有一个最直接的好处,因为容器可以返回一个“假的”实例,来模拟各种情况,大大方便测试。

laravel开局便创建了一个容器,以后所有的类都是从容器中取出的。

image

注册

为了避免多人同时修改同一个文件向容器注册类,laravel将注册地点分成多个文件,这就是服务提供者。我们可以在服务提供者的register方法中向容器注册类。

$this->app->bind('A', A::class);
//单例模式
$this->app->singleton('A', A::class);

如果你有非常多的类需要注册的话,可以用bindingssingletons 属性:

<?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)
    {
        //
    }
}
posted @ 2020-11-20 22:45:41
评论加载中...
发表评论