Laravel核心概念理解——服务容器与服务提供者

PHP Laravel

此文章为作者原创。未经允许,不得用于商业用途。

一、服务容器和服务提供者

关于服务容器和服务提供者的介绍,官方文档是这样写的

The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection. Dependency injection is a fancy phrase that essentially means this: class dependencies are "injected" into the class via the constructor or, in some cases, "setter" methods.

Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services are bootstrapped via service providers……

可以看出Laravel的服务容器就是用来存放(管理)一些需要用到的类的一个"容器",在要用到时,我们就可以从容器中解析这些事先已经绑定到容器中的类,而服务提供者则是注册将来需要的类到服务容器中。

 

二、实践探索

①在app\Demos目录(Demos目录是自己建的)下新建一个demo.php文件,里面写一个Demo类,假如Demo就是我们要存放到服务容器中的一个类

<?php
namespace App\Demos;
class Demo{
	public function print(){
		dd("This is a demo");
	}
}
?>

创建一个服务提供者DemoServiceProvider用来绑定Demo类到服务容器

php artisan make:provider DemoServiceProvider

编辑App\Providers\DemoServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Demos\Demo;
class DemoServiceProvider extends ServiceProvider
{
    protected $defer = true;//延迟加载服务,即在需要Demo类时再加载它
    public function boot()
    {
        //
    }
    public function register()
    {
	//绑定可以理解为"键值对",如这里的"demo"是键,Demo实例是值
        //使用singleton绑定(单例模式绑定回调函数)
        $this->app->singleton('demo',function(){
            return new Demo();
        });
        //使用bind绑定(普通模式绑定回调函数)
        $this->app->bind('demo',function(){
            return new Demo();
        });
		//绑定一个实例对象
	$instance = new Demo();
	$this->app->instance('demo',$instance);
    }
}

不要忘了注册服务提供者,这里我们把DemoServiceProvider追加到cofig/app.php文件的providers数组中

'providers' => [
    //其他服务提供者
    App\Providers\DemoServiceProvider::class,
],

创建一个测试控制器

php artisan make:controller DemoController

编辑DemoController.php

//使用App::make()或app()或resolve()的方式解析(也可以使用$this->app->make()的方式解析服务容器中的类,不过有些页面无法使用$app变量,这时会报错)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Demos\Demo;
use App;
class DemoController extends Controller
{
    public function index(){
		//$d = App::make('demo');
		//$d = app('demo');
    	$d = resolve('demo');
    	$d->print();
    }
}
?>

还有一种解析方式,使用依赖注入

//使用依赖注入的方式
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Demos\Demo;
class DemoController extends Controller
{
    public function __construct(Demo $d){
         $this->d = $d;
    }
    public function index(){
    	$this->d->print();
    }

    //或者直接在普通函数中依赖注入!
    //public function index(Demo $d){
    //	$d->print();
    //}
//}

注册路由

Route::get('/demo','DemoController@index');

最后浏览器访问localhost/your projectName/public/demo打印输出"This is a demo"。


Huas Leung
程序员/web开发者
Light up my life!

分享到: