Laravel 是如何请求 Request 的

好记性不如烂笔头,学习php开发也不能懒,作笔记是一种学习的好习惯!
文章来自:www.haveyb.com/article/168
学习与交流:Laravel技术交流微信群

1、从入口文件开始分析

Laravel的入口文件是 /public/index.php。

在index.php 中,处理请求的代码是:

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

这里,$kernel是上面绑定到服务容器中的 Kernel实现实例,也就是App\Http\Kernel::class

2、分析 $kernel 调用的 handle() 方法

它调用了 handle() 方法,在 App\Http\Kernel.php 中并没有 handle() 方法,因此它调用的其实是它的父类中的handle方法。

它的父类 handle() 方法是这样:

public function handle($request)
{
    try {
        $request->enableHttpMethodParameterOverride();
        $response = $this->sendRequestThroughRouter($request);
    } catch (Exception $e) {
      ...
    } catch (Throwable $e) {
       ...
    }
    ...
    return $response;
}

很轻易的看到,这个方法的作用就是 传入请求,返回响应。

我们看到,这个方法其实接收了一个 $request ,那么这个 $request 就是调用方 index.php 传过来的。

3、分析 $request 的来源

index.php 传过来的 $request:

 $request =  Illuminate\Http\Request::capture()

capture() 方法是这样的:

public static function capture()
{
    // 启用对方法请求参数的支持
    static::enableHttpMethodParameterOverride();
    // 将请求数据赋值给 创建的 Request 对象实例,并返回
    return static::createFromBase(
        SymfonyRequest::createFromGlobals()
    );
}

4、再次回到 index.php

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

$request 对象获取到了,这个对象包含了所有的请求参数,比如请求数据、请求方式、请求 URL、请求头、用户IP、是否使用 HTTPS 等。

然后,index.php 中的 $kernel(处理HTTP请求的核心类)就拿着这个请求实例 $request 去 handle(),然后得到响应。

本作品采用《CC 协议》,转载必须注明作者和本文链接
程序员的福利:免费获取 JetBrains 全家桶激活码 推荐:【点击这里获取 。。。激活码适用:AppCode, CLion, DataGrip, DataSpell, dotCover, dotMemory, dotTrace, goland, IntelliJ IDEA Ultimate, phpstorm, pycharm, ReSharper
Laravel00
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
资深程序猿 @ XX科技
文章
62
粉丝
37
喜欢
249
收藏
571
排名:284
访问:3.3 万
私信
所有博文
社区赞助商