美文网首页
Lararel 框架执行流程详解

Lararel 框架执行流程详解

作者: 小棋子js | 来源:发表于2021-04-07 18:33 被阅读0次

[项目名]/public/index.php

$app = require_once __DIR__.'/../bootstrap/app.php';
//获得Http内核Kernel的示例;构造HttpKernel
$kernel = $app->make(Kernel::class);
//处理请求和响应;发送响应信息
$response = tap($kernel->handle(
    $request = Request::capture()
))->send();
//结束所有中间件以及可终止程序;完成
$kernel->terminate($request, $response);

[项目名]/bootstrap/app.php

<?php

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
//设置接口类的实现类,并使用单例模式实例化实现类。
//注册HttpKernel
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);
//注册ConsoleKernel
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);
//异常处理
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);
return $app;

[项目名]/Http/Kernel.php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Illuminate\Session\Middleware\StartSession::class,
    ];

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\Language::class, //语言包中间件注册。
        ],

        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}
  1. 入口页,public/index.php;引入了 bootstrap 目录下的 app.php,通过 make 方法实例出一个 kernel 对象,Kernel 类是在 Illuminate\Contracts\Http\Kernel ,打印出 Kernel 对象,发现有很多 protected 的属性,简单罗列一下:
* middleware
* middlewareGroups
* routeMiddleware
* app
* router
* bootstrappers
* middlewarePriority

重点看 app 属性,app 属性实际上是一个 Illuminate\Foundation\Application 的实例,里面又包含很多属性值,主要的属性有:

* loadedProviders
* bindings
* instances
* aliases

接着调用了 kernel 类的 handle 方法,传入一个 request 请求,request 请求继承了 SymfonyRequest,并调用了一个 capture 方法,并将返回的值返回给 response 变量。整个流程基本到此为止。
,难道就这么简单,当然不是,请求进来之后,kernel 类做了一系列的验证,分发,处理,包括表单验证,中间件,日志记录,调用控制器,查询数据等等.... 如果能把这中间的整个流程全部搞清楚,并理解为什么这么做,那么你就可以算个咖了,起码是个中咖!

$response = tap($kernel->handle(
    $request = Request::capture()
))->send();

$kernel->terminate($request, $response);
  1. /bootstrap/app.php
// 创建容器$app;参数为应用程序根目录
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

该类是框架核心类,负责启动框架,以及调动其他类提供的功能。
该类继承了Illuminate\Container\Container类,可见该类也是个容器。是整个框架最大的容器;

执行流程

1加载框架类库,创建容器,接收request请求。
2以管道的设计模式 执行部分中间件
3路由解析调度
4实例化当前控制器
5执行web中间件
6执行控制器中间件
7执行控制器操作
8返回response
9接收框架

相关文章

  • Lararel 框架执行流程详解

    [项目名]/public/index.php [项目名]/bootstrap/app.php [项目名]/Http...

  • MyBatis框架执行流程

    1.将框架中配置文件保存到Configuration对象,放入内存中加快读取速度 2.将Configuration...

  • 2018-04-10 准备整体框架

    活动项目策划执行落地流程框架 活动策划流程 确定活动目的/人群→项目ROI核算→活动主题→时间事项确定→ 执行人员...

  • Fork/Join框架详解

    Fork/Join框架详解 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分...

  • Slf4j 源码解析一-无日志实现框架的流程

    目录 本文debug slf4j 的源码执行流程 依次执行不添加 日志实现框架(本篇主讲)添加日志实现框架 通晓S...

  • Android模拟用户行为

    方案一:root设备,使用UiAutomator 框架编写操作流程,通过su命令执行流程。方案二:无需root,利...

  • mybatis入门

    MyBatis框架-倪升武 标签: MyBatis 持久层 mybatis的执行流程 mybatis框架是一个持久...

  • MyBatis的执行流程详解

    说到流程这个事儿,大家可能最先想到的就是富士康的流水线,标准化的分工让每道工序都如丝一般润滑,所以才成就了富士康"...

  • Hibernate框架学习(执行流程)

    Hibernate执行流程 需要注意的是:执行某一个session的方法时,必须开启一个事务Transaction...

  • ThinkPHP 框架的执行流程

    index.php -> 入口文件 Think.class.php -> 框架核心类

网友评论

      本文标题:Lararel 框架执行流程详解

      本文链接:https://www.haomeiwen.com/subject/rybukltx.html