Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点,且也发布长期支持版(LTS)。
一. 请求周期
Laravel 采用了单一入口模式,应用的所有请求入口都是 public/index.php 文件。
1、注册类文件自动加载器:Laravel通过composer进行依赖管理,并在bootstrap/autoload.php中注册了Composer Auto Loader (PSR-4),应用中类的命名空间将被映射到类文件实际路径,不再需要开发者手动导入各种类文件,而由自动加载器自行导入。
因此,Laravel允许你在应用中定义的类可以自由放置在Composer Auto Loader能自动加载的任何目录下,
但大多数时候还是建议放置在app目录下或app的某个子目录下。
2、创建服务容器:从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app(服务容器)。
3、创建 HTTP / Console 内核:传入的请求在HTTP / Console 内核中进行预处理。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel类,
其中注入了 $app 和 $router 两个实例,内核是完成应用引导、请求处理(包括通过Router转发请求等)的场所。
HTTP Kernel 定义了一个 bootstrappers数组,
配置了环境变量加载、应用配置加载、错误处理,以及其他在请求被处理前需要完成的工作。
4、载入服务提供者至容器:
在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的 $app (即所有的服务提供者都要挂载到服务容器下去执行),
服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。
因为这些组件引导和配置了框架的各种功能,所以服务提供者是整个 Laravel启动过程中最为重要的部分,
所有的服务提供者都配置在 config/app.php 文件中的 providers 数组中。首先,所有提供者的 register 方法会被调用;一旦所有提供者注册完成,接下来,boot 方法将会被调用。
5、分发请求:一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给Router进行分发。
在通过Router转发请求时,所有请求都必须先经过全局HTTP中间件栈的处理,再调度到Router并获得其回调,然后执行该回调。
关于中间件:
(1)中间件好比一个过滤层,多个中间件就是多个过滤层,且它们有先后顺序。
(2)全局中间件可分发前执行,也可分发后执行;中间件组使用组key(如'web'、'api')来调用middleware(key)执行,中间件组仅仅是为了使一次将多个中间件指定给路由变得更加方便;路由中间件在(自定义)路由分发中或分发后执行,也是通过key(如'auth')来调用middleware(key)执行的。
(3)你也可以自定义前置或后置中间件,它们的差别在于在请求执行前还是执行后执行自定义动作。
namespace App\Http\Middleware;
useClosure;
class AfterMiddleware
{
public function handle($request, Closure$next)
{
$response=$next($request);
//Perform action
return$response;
}
}(4)如果你想在内核 handle 和 内核 terminate 时使用同一个中间件实例,可使用容器的 singleton 方法向容器注册中间件。
发送响应并结束:由Response发送响应,然后由内核发出terminate,包括调用可终止的中间件(定义了terminate方法的全局HTTP中间件和路由中间件)、 $app 服务容器终止。
二、
三. 依赖注入
四. Artisan Console
五. 表单验证机制
六. 事件机制
Laravel事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。
事件类 (Event) 类通常保存在 app/Events 目录下,而它们的监听类 (Listener) 类被保存在 app/Listeners 目录下,
使用 Artisan 命令来生成事件和监听器时他们会被自动创建。
注册事件和监听器:EventServiceProvider的 listen 属性数组用于事件(键)到对应的监听器(值)的注册,然后运行 php artisan event:generate将自动生成EventServiceProvider中所注册的事件(类)模板和监听器模板,然后在此基础之上进行修改来实现完整事件和监听器定义;
另外,你也可以在 EventServiceProvider 类的 boot 方法中通过注册闭包事件来实现
定义事件(类):事件(类)就是一个包含与事件相关信息数据的容器,不包含其它逻辑
namespace App\Events;
use App\Order;
use Illuminate\Queue\SerializesModels;
class OrderShipped
{
use SerializesModels;
public $order;
/**
* 创建一个事件实例。
*
* @param Order $order
* @return void
*/
public function__construct(Order$order)
{
$this->order =$order;
}
}
定义监听器:事件监听器在 handle 方法中接受了事件实例作为参数
namespace App\Listeners;
use App\Events\OrderShipped;
class SendShipmentNotification
{
/**
* 创建事件监听器。
*
* @return void
*/
public function__construct()
{
//
}
/**
* 处理事件
*
* @param OrderShipped $event
* @return void
*/
public function handle(OrderShipped$event)
{
//使用 $event->order 来访问 order ...28}
}