zoukankan      html  css  js  c++  java
  • 图解Laravel的生命周期

    先来张图大致理解下laravel的生命周期。

    下面对应相应的代码,解释上图。

    //文件路径:laravel/public/index.php
    
    /**
     * laravel的启动时间
     */
    define('LARAVEL_START', microtime(true));
    
    /**
     * 加载项目依赖。
     * 现代PHP依赖于Composer包管理器,入口文件通过引入由Composer包管理器。
     * 自动生成的类加载程序,可以轻松注册并加载所依赖的第三方组件库。
     */
    require __DIR__.'/../vendor/autoload.php';
    
    /**
     * 创建laravel应用实例。
     */
    $app = require_once __DIR__.'/../bootstrap/app.php';
    
    // 接受请求并响应
    $kernel = $app->make(IlluminateContractsHttpKernel::class);
    
    $response = $kernel->handle(
        $request = IlluminateHttpRequest::capture()
    );
    
    // 结束请求,进行回调
    $response->send();
    
    // 终止程序
    $kernel->terminate($request, $response);
    
    //文件路径:laravel/boostrap/app.php
    
    //第一部分:创建应用实例
    $app = new IlluminateFoundationApplication(
        realpath(__DIR__.'/../')
    );
    
    //第二部分:完成内核绑定
    $app->singleton(
        IlluminateContractsHttpKernel::class,
        AppHttpKernel::class
    );
    
    $app->singleton(
        IlluminateContractsConsoleKernel::class,
        AppConsoleKernel::class
    );
    
    $app->singleton(
        IlluminateContractsDebugExceptionHandler::class,
        AppExceptionsHandler::class
    );
    
    return $app;
    
    文件路径:laravelvendorlaravelframeworksrcIlluminateFoundationHttpKernel.php
    
    class Kernel implements KernelContract
    {
        protected $bootstrappers = [
            IlluminateFoundationBootstrapLoadEnvironmentVariables::class, // 注册系统环境配置
            IlluminateFoundationBootstrapLoadConfiguration::class,              // 注册系统配置 
            IlluminateFoundationBootstrapHandleExceptions::class,              // 注册异常注册
            IlluminateFoundationBootstrapRegisterFacades::class,                // 注册门面模式
            IlluminateFoundationBootstrapRegisterProviders::class,              // 注册服务提供者 
            IlluminateFoundationBootstrapBootProviders::class,                    // 注册服务提供者boot
        ];
    
        // 处理请求
        public function handle($request)
        {
            try {
                $request->enableHttpMethodParameterOverride();
    
                $response = $this->sendRequestThroughRouter($request);
            } catch (Exception $e) {
                $this->reportException($e);
    
                $response = $this->renderException($request, $e);
            } catch (Throwable $e) {
                $this->reportException($e = new FatalThrowableError($e));
    
                $response = $this->renderException($request, $e);
            }
    
            $this->app['events']->dispatch(
                new EventsRequestHandled($request, $response)
            );
    
            return $response;
        }
    
        protected function sendRequestThroughRouter($request)
        {
            //一、将$request实例注册到APP容器
            $this->app->instance('request', $request);
    
            //二、清除之前的$request实例缓存
            Facade::clearResolvedInstance('request');
    
            //三、启动引导程序
            $this->bootstrap();
    
            //四、发送请求
            return (new Pipeline($this->app)) //创建管道
                        ->send($request)      //发送请求
                        ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)  //通过中间件
                        ->then($this->dispatchToRouter());  //分发到路由
        }
    
        // 启动引导程序
        public function bootstrap()
        {
            if (! $this->app->hasBeenBootstrapped()) {
                $this->app->bootstrapWith($this->bootstrappers());
            }
        }
        
        // 路由分发
        protected function dispatchToRouter()
        {
            return function ($request) {
                $this->app->instance('request', $request);
    
                return $this->router->dispatch($request);
            };
        }
    
        // 终止程序
        public function terminate($request, $response)
        {
            $this->terminateMiddleware($request, $response);
    
            $this->app->terminate();
        }
    
    
  • 相关阅读:
    *p++与(*p)++与*(p++)------自增运算符常见误区
    二维数组(解引用、指针数组、数组的指针)——C语言
    二叉树、前序遍历、中序遍历、后序遍历
    C语言参数传递(值传递、地址传递)+二级指针
    文件操作(FILE)与常用文件操作函数——C语言
    结构体(结构体嵌套、结构体指针、结构体参数传递)
    链表(单向链表的建立、删除、插入、打印)
    博文与文档发布玩法:Github + MWeb + 语雀 + Cnbolgs
    [笔记] Git 冲突处理
    [笔记] C# 如何获取文件的 MIME Type
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/9745459.html
Copyright © 2011-2022 走看看