Laravel 之 Application---理论篇

核心概念#

laravel 中的 Application 首先是一个容器对象,其次也是一个应用程序对象。

容器对象#

作为容器对象,它提供了以下功能

  • 注册创建对象的规则,并在需要的时候创建它;
  • 提供了类似全局变量存储数据的能力。

只需要往容器里面注册一下创建对象的规则,对于使用者而言,只需要使用的时候直接找容器索取,这样做带来的好处有:

  • 对象集中管理,如果把对象比喻成怪兽,那么容器对象就是装怪兽的笼子,怪兽被装进了一个由你控制的笼子里面了,你想干什么都容器。
  • 降低耦合,创建规则和使用的分离,对于使用者而言,完全不必关注如何创建,只管使用就好了。

注意:容器对象在创建类的时候,如果被创建的类的构造函数定义的参数是基本类型的值 (string,int....) 的话,必须手动传入这个参数,
如果是构造函数的参数是对象类型值的话,容器对象会自动创建注入。

例子


 class Car{

     protected $name;
     public function __construct( $name)
     {
         $this->name = $name;
     }

     function __toString()
     {
        return (string)$this->name;
     }

 }

 $app = new \Illuminate\Foundation\Application();

 // 错误的返回,因为Car的构造函数需要一个基本的数据类型的值,容易对象无法自动构建
 // $app->bind('car',Car::class);

 //正确的方式,手动在定义创建规则的时候传入参数
 $app->bind('car',function(){
     return new Car('雷克萨斯');
 });

 echo $app->make('car');

应用程序对象#

Application 作为了一个应用程序对象,主要提供了一下功能:

  • 注册基础核心服务,EventServiceProvider(events),LogServiceProvider(log),RoutingServiceProvider(路由相关服务)
  • 提供了执行 bootstrappers 列表的 API 接口 bootstrapWith
  • 提供了执行 serviceProvider 列表的 API 接口 boot
  • 提供了获取设置应用程序内部信息的功能。

总结#

以容器为核心的思考方式要遵循以下 3 点

  • 在整个应用程序运行的过程中有且只有一个容器对象
  • 向容器里面注册构造对象的规则
  • 从容器对象获取对象

深入理解其机理最好的方式就是阅读 interface Application 这个接口的代码。

代码表示如下


class Car{

    protected $name;
    public function __construct(\Illuminate\Foundation\Application $app, $name)
    {
        $this->name = $name;
        // $app 
    }

    function __toString()
    {
       return (string)$this->name;
    }

}

$app = new \Illuminate\Foundation\Application();

// 注册构建对象的规则
$app->bind('car',function()use($app){
    return new Car($app,'雷克萨斯');
});

// 使用
echo $app->make('car');
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

对于非依赖注入的情形,其实也可以在解析对象的时候传入所需参数。如果在写解析规则的时候就将传入参数写死,感觉不太好。

Route::get('/',function(){
    $app = app();
    $app->bind('car',Car::class);
    echo $app->make('car', ['name'=>'test']);
});
6年前 评论

作者最后给的 interface Application 代码复制错了,补充上 (Larave 5.5 版本)

代码已被折叠,点此展开
5年前 评论