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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5

很简洁, 但说明白了,并且可以直接按此步骤使用了. :+1:

5年前 评论

最后一个是Jian::ComBoard(); 还是 Jian:type()

5年前 评论

@yufatang Jian:type () 码错字了 , :joy:

5年前 评论
App::bind('Board', function($container){
        return new ComBoard;
    });

直接这样也可以吧

App::bind('Board', 'ComBoard');
5年前 评论

@lovecn 嗯嗯 可以的,开始只是简单的测试了一下

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!