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基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
PHP生成UTF8文件的方法
May 15 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
PHP生成短网址方法汇总
Jul 12 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
浅谈Python中的私有变量
2018/02/28 Python
python实现学员管理系统
2019/02/26 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
买房子个人收入证明
2014/01/16 职场文书
社团文化节策划书
2014/02/01 职场文书
《问银河》教学反思
2014/02/19 职场文书
文明工地标语
2014/06/16 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
小程序实现筛子抽奖
2021/05/26 Javascript