Laravel 中 IoC 容器 服务提供者和门面的使用
IOC容器
IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;ioc则是我们把自己 new 对象和调用的交给了ioc容器来去实现 ,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
- ioc 容器
控制反转
也称为服务容器
,或者说是一种超级工厂模式
- laravel 也自带容器并不用我们去刻意封装的,在 config 下的 app.php 中的 aliases 可以发现门面 App 位于 Illuminate\Support\Facades\App::class,可以直接使用
- 我们主要使用了容器中的bind()方法和make()方法
我们通过依赖注入机制,只需通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解DI主要有几点 : 谁依赖谁,为什么需要依赖,谁注入谁,注入了什么
- 谁依赖于谁:当然是应用程序依赖于IoC容器;
- 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
- 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
- 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
说的有点多,下来说一下简单服务容器的demo:
在app下创建一个 DI 目录,DI 目录下创建 interface 目录, interface 下存放接口文件,DI 下存放实现接口的类
- interface下
<?php namespace App\DI\interface; interface Board{ public function type(); }
- DI 下
<?php namespace App\DI; use App\rong\jie\Board; //CommonBoard依赖 class ComBoard implements Board { public function __construct(){} public function type(){ echo '键盘'; } }
<?php namespace App\rong; use App\rong\jie\Board; //MechanicalKeyboard依赖 class MechanicalKeyboard implements Board { public function __construct(){} public function type(){ echo '机械键盘'; } }
- 控制器中的使用,简单的容器
//Board 为接口, CommonBoard 是 class CommonBoard,bind相当于注册,就是把东西放入容器 App::bind('Board', function($container){ return new ComBoard; }); //make 取出 return App::make('Board')->type();
- 服务提供者
//使用命令生成服务 默认存储在app下的providers下 php artisan make:provider ProviderName
- 编写ProviderName文件
//注册 别忘了加命名空间 public function register() { App::bind('Board', 'ComBoard');//Board 为接口, ComBoard 是 class ComBoard,bind相当于注册,就是把东西放入容器 } //注册后执行 public function boot() { // }
- 注册服务 在 config 下的 app.php 下的 providers 中注册
App\Providers\ProviderName::class
- 完成后,可以在控制器中查看 也可以继续下面
//可直接查看 无需在进行bind命令 return App::make('Board')->type();
- 门面的使用 编写门面
namespace App\Facade; use Illuminate\Support\Facades\Facade; class NameFacade extends Facade { protected static function getFacadeAccessor() { //这里返回的是ServiceProvider中注册时,定义的字符串 return 'Board'; } }
- 给服务起别名 在 config 下的 app.php的aliases中编写
'Jian'=> App\Facade\NameFacade::class
- 全部完成,controller显示
//不要忘记引用 [ use Jian;] return Jian::type();
只是一个简单demo
本作品采用《CC 协议》,转载必须注明作者和本文链接
很简洁, 但说明白了,并且可以直接按此步骤使用了. :+1:
最后一个是Jian::ComBoard(); 还是 Jian:type()
@yufatang Jian:type () 码错字了 , :joy:
直接这样也可以吧
@lovecn 嗯嗯 可以的,开始只是简单的测试了一下