前言

提升能力的方法并非使用更多工具,而是解刨自己所使用的工具。今天我们从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的启动,至于结果的返回则有开发者自行通过控制器或其他可访问类返回。

致谢

感谢你看到这里,本篇文章源码解析靠个人理解。如有出入请拍砖。

希望本篇文章可以帮到你。谢谢

原文地址:https://segmentfault.com/a/1190000016522619

转载于:https://www.cnblogs.com/lalalagq/p/9969852.html

Laravel源码解析之从入口开始相关推荐

  1. Laravel源码解析之Console内核

    上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的.除了处理HTT ...

  2. Laravel源码解析之中间件

    中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求 ...

  3. Vue源码解析之函数入口

    从入口开始看起 写博客就是记录自己撸码的过程和问题,好了~废话就不多说了,直接源码撸起,通过上一篇博客咱们大致知道了Vue源码目录设计,下面我们要一步步找到vue的入口 通过查看package.jso ...

  4. Laravel源码解析之ENV配置

    Laravel在启动时会加载项目中的 .env文件.对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的. 例如,你可能希望在本地使用测试的 Mysql数据库而在上线后希望项目能够自动切换 ...

  5. Laravel源码解析之事件系统

    Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件.事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器. laravel 中事件系统由两部分构 ...

  6. Laravel源码解析之Eloquent Model

    上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现.这篇文章我们来学习Laravel ...

  7. Laravel源码解析之QueryBuilder

    Database 查询构建器 上文我们说到执行 DB::table('users')->get()是由Connection对象执行table方法返回了一个QueryBuilder对象,Query ...

  8. Laravel源码解析之Request

    很多框架都会将来自客户端的请求抽象成类方便应用程序使用,在Laravel中也不例外. Illuminate\Http\Request类在Laravel框架中就是对客户端请求的抽象,它是构建在 Symf ...

  9. Laravel源码解析之HTTP Kernel

    由于 PHP 可以处理 WEB 和 CLI 两种接口请求,所以 Laravel中设计 HttpKernel 和 ConsoleKernel 来处理这两种类型的请求,Http Kernel是Larave ...

最新文章

  1. 物种丰度排序堆积柱形图及处理间各物种差异分析
  2. python界面图片-python实现读取并显示图片方法(不需要图形界面)
  3. appium-在页面点击一下处理(一般处理提示蒙层)
  4. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
  5. 比0 冷1度c语言编程,关于DS18B20的C语言程序(精确度0.1度).doc
  6. CF思维联系– Codeforces-988C Equal Sums (哈希)
  7. 菜单栏底部线条切换效果
  8. oracle取时间最近的一条数据_当数据库最近一直卡顿时,第一时间应该用这条sql来分析...
  9. linux的shell键盘输入,linux shell获取键盘输入
  10. Linux vi 命令创建,Linux vi命令 创建文件
  11. 《程序员修炼之道 - 从小工到专家》吐血解读
  12. ajax回调函数的使用;ajax请求成功后对数据的再次使用
  13. 花式方法解决不同vlan的主机互通
  14. 2021届大学毕业生薪酬排名出炉 | 超50所高校月薪过万!
  15. 【python】【数据处理】画多维数据分布图
  16. 考研数学笔记(更新中)
  17. 如何做好检测报告的质量控制?-LIMS2
  18. 苹果登陆代理方法didCompleteWithAuthorization没有调用,didCompleteWithError没有走
  19. MFC绘图工具High-speed Charting Control(VS2019)
  20. 中国大学MOOC音乐与健康试题及答案

热门文章

  1. vCenter6.0配置二:配置HA群集
  2. 【iCore3 双核心板_ uC/OS-III】例程一:认识 uC/OS-III
  3. LA 6474 Drop Zone (最小割)
  4. mybatis3.2.8 与 hibernate4.3.6 混用
  5. 统一沟通-技巧-9-Lync 2010-Outlook 2010-自动配置-2-普通人员
  6. android js变量定义数组长度,js 声明数组和向数组中添加对象变量的简单实例
  7. android进度条课设报告,Android开发之进度条ProgressBar的示例代码
  8. 【正一专栏】登贝莱,该不该来!
  9. 在线实时大数据平台Storm本地模式运行的一个小发现
  10. vc6.0开发环境两个辅助工具