第一章 文件结构
1、 Laravel框架所有配置文件都保存在config目录中。
2、 根目录:
1) app
2) bootstrap
3) config
4) database
5) public
6) resources
7) routes
8) storage
9) tests
10)vendor
3、1)app目录包含应用程序的核心代码,几乎所有类都在这里。
2)Bootstrap目录包含引导框架的app.php,还包含一个cache目录(存放框架生成的用来提升性能的文件)
3)config目录,应用程序的所有配置文件
4)database目录包含数据填充和迁移文件以及模型工厂类。还可以作为SQLite数据库存放目录。
5)public目录包含入口文件index.php,进入应用程序的所有请求的入口点。此目录还包含一些资源文件(图片、js、css)
6)resources目录。包含了视图和未编译的资源文件(如less、sass、js),还包含所有语言文件
7)routes目录包含所有路由定义。
默认包含web.php、api.php、console.php和channels.php
《1》 Web.php包含routeServiceProvider放置在web中间件组中的路由,它提供会话状态、CSRF防护和cookie加密。
《2》 api.php包含routeServiceProvider放置在api中间件组中的路由,他提供频率限制
《3》 console.php是定义所有给予控制台命令闭包函数的地方。
《4》 channel.php是用来注册你的应用支持的所有的事件广播渠道的地方
8)storage目录包含编译后的blade模板、session会话生成的文件、缓存文件以及框架生成的其他文件。
《1》app:存储应用生成的任何文件
《2》framework:用来存储框架生成的文件和缓存
《3》logs:应用的日志文件
9)Tests目录:包含自动化测试文件,每个测试类都应该以“Test”作为后缀。
10)vendor目录:包含所有的composer依赖包。
4、
1)app目录,包含额外的各种目录,如console,http,provider。将console和http目录视为向应用程序的核心提供API。Console包含所有的Artisan命令,而http目录包含你的控制器,中间件和请求。
《1》broadcasting
《2》console包含应用程序所有自定义ARTisan命令。可以注册自定义的artisan命令。
《3》events目录,默认不存在,安置事件类
《4》exceptions目录包含应用程序的异常处理
《5》 http目录包含控制器、中间件和表单请求。处理进入应用程序请求的所有逻辑几乎都放置在此目录
《6》 jobs目录(默认不存在)安置应用程序的队列任务。
《7》 listeners目录(默认不存在)包含事件的处理类。事件侦听器接受一个事件实例并执行逻辑以响应被触发的事件。
《8》 mail目录(默认不存在)包含应用程序发送邮件的所有类.构建一个封装所有逻辑的邮件类。
《9》 notifications目录(默认不存在)包含应用程序的发送的所有事务通知
《10》 policies目录(默认不存在)包含应用程序的授权策略类
《11》 providers目录包含应用程序的所有服务提供者。
《12》 rules目录(默认不存在)包含应用程序的自定义验证规则对象。规则用于将复杂的验证逻辑封装在一个简单对象中。
第二章 请求周期/过程
1、 请求入口index.php
2、 Index.php文件加载composer生成的自动加载设置
3、 从bootstrap/app.php脚本中检索laravel应用程序的实例。
4、 Laravel第一个动作是创建一个应用程序/服务容器。
5、 根据进入应用程序的请求类型来将传入的请求发送到http内核或控制台内核。(这两个内核是用来作为所有请求都要通过的中心位置)
1) http内核继承了Illuminate\Foundation\Http\Kernel 类,该类定义了一个bootstrappers数组。这些bootstrappers配置了错误处理,日志,检测应用环境,以及其他在请求被处理前需要被执行的任务。
2) http内核还定义了所有请求被应用程序处理之前必须经过的HTTP中间件,这些中间件处理HTTP会话读写、判断应用是否处于维护模式、验证CSRF令牌等等。
3) http内核的handle方法:获取一个request,返回一个response。
6、 内核启动操作中。所有服务提供者的register方法都会被调用,然后一旦所有服务提供者均注册后,boot方法才被调用。
服务提供者给予框架开启多种多样的组件,像数据库,队列,验证器,以及路由组件。只要被启动服务提供者就可以支配框架的所有功能,所以服务提供者也是laravel整个引导周期最重要的组成部分。
Ps:服务提供者:服务的被调用方(为其他服务提供服务的服务)
服务消费者:服务的调用方(以来其他服务的服务)
所有应用下的服务提供者均配置到config/app.php配置文件中providers数组中。
7、 一旦启动且所有服务提供者都被注册,request会被递送给路由。路由将会调度请求,交给绑定的路由或控制器,也包括路由绑定的中间件。
第三章 服务容器
1、laravel服务容器是一个用于管理类的依赖和执行依赖注入的强大工具。
类的以来通过构造函数,或者某种情况下通过setter方法注入到类中。
2、服务绑定
在服务提供器中,可以通过$this->app属性访问容器。可以通过容器的bind方法注册绑定。
bind(要绑定的类/接口名,返回类实例的closure)
依赖注入:只要不是由内部生产(比如初始化、构造函数_construct中通过工厂方法、自行手动new的),而是由外部参数或其他形式注入的,都是以来注入。
<?php
class Container
{
protected $binds;//数组
protected $instances;//数组
//$abstract是超人的名称和超能力,$concrete是具体的生成的方法
public function bind($abstract, $concrete)
{
if ($concrete instanceof Closure) {
//匿名函数
$this->binds[$abstract] = $concrete;
} else {
$this->instances[$abstract] = $concrete;
}
}
public function make($abstract, $parameters = [])
{
//如果为null,返回0
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
array_unshift($parameters, $this);
return call_user_func_array($this->binds[$abstract], $parameters);
}
}
// 创建一个容器(后面称作超级工厂)
$container = new Container;
// 向该 超级工厂 添加 超人 的生产脚本
$container->bind('superman', function($container, $moduleName) {
return new Superman($container->make($moduleName));
});
// 向该 超级工厂 添加 超能力模组 的生产脚本
$container->bind('xpower', function($container) {
return new XPower;
});
// 同上
$container->bind('ultrabomb', function($container) {
return new UltraBomb;
});
// ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', 'xpower');
$superman_2 = $container->make('superman', 'ultrabomb');
$superman_3 = $container->make('superman', 'xpower');
3、 closure用于代表匿名函数的类。
匿名函数没有名字,如果使用他,需要返回一个变量。
4、index.php文件里面有一行初始化服务器容器的代码,调度的相关文件就是app.php