laravel 服务提供者

laravel ServiceProvider

服务提供者在app初始化注册进容器 ,每个服务提供者均继承基础的抽象类ServiceProvider

\Laravel\Lumen\Application::register

初始化的时候通过register方法加载到loadedProviders数组里,判断register和boot方法是否存在,存在则在注册的时候调用初始化。

,boot方法用于类的初始化

/**
 * Register a service provider with the application.
 *
 * @param  \Illuminate\Support\ServiceProvider|string  $provider
 * @return \Illuminate\Support\ServiceProvider
 */
public function register($provider)
{
    if (! $provider instanceof ServiceProvider) {
        $provider = new $provider($this);
    }

    if (array_key_exists($providerName = get_class($provider), $this->loadedProviders)) {
        return;
    }

    $this->loadedProviders[$providerName] = true;

    if (method_exists($provider, 'register')) {
        $provider->register();
    }

    if (method_exists($provider, 'boot')) {
        return $this->call([$provider, 'boot']);
    }
}

register方法用于注入类到容器中,boot方法用于在启动的时候加载

app.php中绑定到容器中

$app->register(App\Providers\TestServiceProvider::class);

/**
 * Class TestServiceProvider
 * @package App\Providers
 */
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Providers\Test1;

class TestServiceProvider extends ServiceProvider
{
    public function boot()
    {
        echo "this is boot!\n"
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton("test1", function () {
            return new Test1();
        });
    }
}


namespace App\Providers;

/**
 * Class Test1
 * @package App\Providers
 */
class Test1
{
    public function test()
    {
        echo "this is test!\n";
    }
}

接下来应用可以用依赖注入的方式活着app函数去寻找我们绑定的别名

class TestController extends Controller
{
    const  Privileges = [
        'test' => '*',
    ];

    public function test()
    {
        var_dump(app('test')->test());exit;
    }
}

use App\Providers\Test1;
class TestController extends Controller
{
    public function test()
    {
        var_dump(app('test')->test());exit;
    }
    
    public function test1(Test1 $test1)
    {
        var_dump($test1->test());exit;
    }
}

这里面最主要的就是利用register方法把我们实例处理业务的类注入到容器中,然后在用的时候就可以从容器中取出一个实例来,实现业务代码的解藕。

你可能感兴趣的:(laravel 服务提供者)