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 协议》,转载必须注明作者和本文链接
对于非依赖注入的情形,其实也可以在解析对象的时候传入所需参数。如果在写解析规则的时候就将传入参数写死,感觉不太好。
作者最后给的
interface Application
代码复制错了, 补充上 (Larave 5.5版本)