Laravel框架源码解析之入口文件原理分析


Posted in PHP onMay 14, 2020

本文实例讲述了Laravel框架源码解析之入口文件原理。分享给大家供大家参考,具体如下:

前言

提升能力的方法并非使用更多工具,而是解刨自己所使用的工具。今天我们从Laravel启动的第一步开始讲起。

入口文件

laravel是单入口框架,所有请求必将经过index.php

define('LARAVEL_START', microtime(true)); // 获取启动时间

使用composer是现代PHP的标志

require __DIR__.'/../vendor/autoload.php'; // 加载composer -> autoload.php

加载启动文件

$app = require_once __DIR__.'/../bootstrap/app.php';

获取$app是laravel启动的关键,也可以说$app是用于启动laravel内核的钥匙?。随后就是加载内核,载入服务提供者、门面所映射的实体类,中间件,最后到接收http请求并返回结果。

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); // 加载核心类

$response = $kernel->handle(
 $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

看似短短的4行代码,这则是laravel的优雅之处。我们开始深层次解刨。

bootstrap\app.php

这个启动文件也可以看作是一个服务提供者,不过他并没有boot,register方法。因为入口文件直接加载他,所有这些没必要的方法就不存在了。

作为启动文件,首页则是加载框架所有必须的要要件,例如

  • registerBaseBindings
  • registerBaseServiceProviders
  • registerCoreContainerAliases,

这其中包括了很多基础性的方法和类,例如

  • db [\Illuminate\Database\DatabaseManager::class]
  • auth [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class]
  • log [\Illuminate\Log\LogManager::class, \Psr\Log\LoggerInterface::class]
  • queue [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class]
  • redis [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class]
  • 等等 ...

而$app这个在服务提供者的核心变量则就是Application实例化所得,而你在服务提供者内使用的make,bind,singleton来自他的父类Container,都说容器是laravel的核心概念。这块的概念后续我们会详细的讲解。

$app = new Illuminate\Foundation\Application(
 realpath(__DIR__.'/../')
);

上面我们已经获得$app的实例化了,现在通过$app来注册核心类、异常类,并将$app返回给index.php

$app->singleton(
 Illuminate\Contracts\Http\Kernel::class,
 App\Http\Kernel::class
);

$app->singleton(
 Illuminate\Contracts\Console\Kernel::class,
 App\Console\Kernel::class
);

$app->singleton(
 Illuminate\Contracts\Debug\ExceptionHandler::class,
 App\Exceptions\Handler::class
);

App\Http\Kernel

核心类了所有的

  • 系统中间件
  • 群组中间件
  • 路由中间件

当然你需要使用中间件也是在这个类中加载,是经常被使用的一个文件。

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
   \App\Http\Middleware\TrimStrings::class,
   \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
   \App\Http\Middleware\TrustProxies::class,
  ];
  
  /**
   * The application's route middleware groups.
   *
   * @var array
   */
  protected $middlewareGroups = [
   'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    // \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
   ],
   
   'api' => [
    'throttle:60,1',
    'bindings',
   ],
  ];

这个核心类继承自他的父类Illuminate\Foundation\Http\Kernel::class,核心类做了很多事情,它会将所有的中间件全部存储到一个指定的数组,方便内核调用及其他类调用。

namespace App\Http;
 
use App\Api\Middleware\VerifyApiToken;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
 
class Kernel extends HttpKernel

回到起点

Laravel的启动经历了很繁琐的一个过程。这也是Laravel优雅的关键点。

$response = $kernel->handle(
 $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

将请求传入则完成了整个laravel的启动,至于结果的返回则有开发者自行通过控制器或其他可访问类返回。

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
国内php原创论坛
Oct 09 PHP
用PHP实现的随机广告显示代码
Jun 14 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
php版微信发红包接口用法示例
Sep 23 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
Laravel框架源码解析之反射的使用详解
May 14 #PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 #PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 #PHP
php中用unset销毁变量并释放内存
May 10 #PHP
php屏蔽错误及提示的方法
May 10 #PHP
php判断数组是否为空的实例方法
May 10 #PHP
通过PHP实现获取访问用户IP
May 09 #PHP
You might like
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
PHP中的替代语法介绍
2015/01/09 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
详解Python中的四种队列
2018/05/21 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Python类型转换的魔术方法详解
2020/12/23 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
Java中实现多态的机制
2015/08/09 面试题
介绍一下Linux中的链接
2016/06/05 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
市场营销求职信范文
2014/02/21 职场文书
2015个人半年总结范文
2015/03/09 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS