php artisan实现机制,laravel 原理机制及几个重要功能
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}
}
php artisan实现机制,laravel 原理机制及几个重要功能相关推荐
- Laravel框架一:原理机制篇
转载自http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点. ...
- Java序列化的机制和原理
有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- J2EE JVM加载class文件的原理机制
JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...
- JVM加载class文件的原理机制
阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
- 主机主浏览服务器宣告的运作原理机制
主机主浏览服务器宣告的运作原理机制.刚启动的电脑会在第1,第2,第4,第8 第12 分钟向主浏览器进行主机宣告,此后每间隔12分钟进行主机宣告! 问题一 请问如果第1分钟就已经注册成功了,那是不是 ...
- Android 为什么要有handler机制?handler机制的原理
为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
最新文章
- c语言的文案,点心回顾 | 这是一个充满有趣灵魂的C语言乐园!
- html中用来标记关键字的标识,简单的HTML标识属性与识别
- ubuntu将mysql、nginx添加到环境变量中
- MySQL修改datadir目录
- 简单型的弱电机房工程汇报方案
- 基于以太坊的去中心化宠物商店构建教程
- C#中的继承与多态还有接口
- Kubernetes学习之路(四)之Node节点二进制部署
- 取某个字段的前几位 php,php如何实现截取前几个字符
- java集合转js数值_前端js调用接口转换Map数组数据
- 卡布教你:脸上长痘痘平时要注意什么呢
- 30秒Python轻松入门-目录
- 云计算之Docker
- 动态规划实战14 leetcode-312. Burst Balloons
- 西电电子线路实验课程设计通关模板
- 乐高wedo搭建图纸_乐高wedo2.0图纸 无齿翼龙
- 线性代数笔记(矩阵)
- 03 数据载入、存储及文件格式
- JDBC 学习笔记 day02 用 PreparedStatement 实现 CRUD 操作
- react组件类型及深入理解react高阶组件
热门文章
- R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
- R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框、竖向文本框)
- R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)
- R语言tidyr包pivot_longer函数、pivot_wider函数数据表变换实战(长表到宽表、宽表到长表)
- 深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战
- R语言创建频数表和列联表
- python内存管理 变量无需事先声明_python 内存管理
- MMD_3a_CommunitiesInSN
- R 循环中将变量作为对象名
- 统计学:统计学概述(一)