精华内容
下载资源
问答
  • laravel框架流程
    2020-12-28 09:20:19

    Laravel 框架入口文件为:index.php

    1、引入自动加载 autoload.php 文件

    2、创建应用实例,并同时完成了

    基本绑定($this、容器类Container等等)、
    
    基本服务提供者的注册(Event、log、routing)、
    
    核心类别名的注册(比如db、auth、config、router等)

    3、开始 Http 请求的处理

    make 方法从容器中解析指定的值为实际的类,比如 $app->make(Illuminate\Contracts\Http\Kernel::class); 解析出来 App\Http\Kernel 
    
    handle 方法对 http 请求进行处理
    
    实际上是 handle 中 sendRequestThroughRouter 处理 http 的请求
    
    首先,将 request 绑定到共享实例
    
    然后执行 bootstarp 方法,运行给定的引导类数组 $bootstrappers,这里是重点,包括了加载配置文件、环境变量、服务提供者、门面、异常处理、引导提供者等
    
    之后,进入管道模式,经过中间件的处理过滤后,再进行用户请求的分发
    
    在请求分发时,首先,查找与给定请求匹配的路由,然后执行 runRoute 方法,实际处理请求的时候 runRoute 中的 runRouteWithinStack 
    
    最后,经过 runRouteWithinStack 中的 run 方法,将请求分配到实际的控制器中,执行闭包或者方法,并得到响应结果

    4、 将处理结果返回

    详细源码分

    更多相关内容
  • laravel框架加载流程

    2021-04-26 14:09:32
    生成Laravel应用程序实例 $app 并且绑定核心 AppHttpKernel::class 或 AppConsoleKernel::class 这取决于请求类型 在这里请求经过一些列操作 最终返回浏览器 app/Http/Kernel.php 一般情况是 HTTP 请求,所以.

    在这里插入图片描述
    public/index.php

    此文件会加载由 Composer 生成的自动加载器定义
    并获取由 bootstrap/app.php 文件中所生成的 Laravel 应用程序实例

    bootstrap/app.php

    生成Laravel应用程序实例 $app
    并且绑定核心 AppHttpKernel::class 或 AppConsoleKernel::class
    这取决于请求类型 在这里请求经过一些列操作 最终返回浏览器

    app/Http/Kernel.php

    一般情况是 HTTP 请求,所以主要说些这个
    这个类继承自 IlluminateFoundationHttpKernel 它定义了一个 bootstrappers 数组,在请求被运行前会先行运作。这些启动器设置了错误处理、日志记录、侦测应用程序环境,并运行其它需要在请求实际处理前就该被完成掉的工作。
    其实这个过程就是 启动框架的服务提供者 -> IlluminateFoundationBootstrapBootProviders 这个继承自 IlluminateContractsFoundationApplication 但是实现却是一开始的 IlluminateFoundationApplication 也就是创建框架实例那个文件里 有这个方法 (有点搞不懂 继承自一个接口,接口没有功能,自己也没有功能,而下面实现这个功能的又没有继承他 那如何找到这个功能的呢) 看这里接口说明
    app/Http/Kernel.php
    HTTP 核心也定义了一份 HTTP 中间件 清单,所有的请求在被应用程序处理之前都必须经过它们。这些中间件处理 HTTP session 的读写、验证 CSRF 令牌、决定应用程序是否处于维护模式,以及其它更多任务作。

    router

    所有服务提供者加载完毕后,把request请求转移给router路由器
    经过router分派给route(路由)或者controller,并运行中间件处理后返回response(响应)

    在这里插入图片描述
    整个启动流程,主要涉及的几个文件如下
    public/index.php,bootstrap/app.php,app/Http/Kernel.php,
    除了Kernel另外两个文件去掉注释,基本很简洁

    public/index.php

    require __DIR__.'/../bootstrap/autoload.php';
    
    //启动框架,生成应用程序
    $app = require_once __DIR__.'/../bootstrap/app.php';
    
    //运行应用程序,接收Request请求
    $kernel = $app->make(IlluminateContractsHttpKernel::class);
    
    //经过路由器分发到路由,控制器,中间件的处理返回Response
    $response = $kernel->handle(
        $request = IlluminateHttpRequest::capture()
    );
    //发送响应到浏览器
    $response->send();
    //销毁请求与响应
    $kernel->terminate($request, $response);
    

    bootstrap/app.php

    //创建应用程序
    $app = new IlluminateFoundationApplication(
        realpath(__DIR__.'/../')
    );
    
    //重要的接口绑定 (会根据不同请求,做不同响应.所以主要说下Http)
    $app->singleton(
        IlluminateContractsHttpKernel::class,
        AppHttpKernel::class
    );
    
    $app->singleton(
        IlluminateContractsConsoleKernel::class,
        AppConsoleKernel::class
    );
    
    $app->singleton(
        IlluminateContractsDebugExceptionHandler::class,
        AppExceptionsHandler::class
    );
    
    //返回应用程序
    return $app;
    

    app/Http/Kernel.php

    namespace Http;
    
    use IlluminateFoundationHttpKernel as HttpKernel;
    
    //这里需要说明下,Kernel继承自HttpKernel也就是框架基础核心.
    //基础核心主要作用就是,加载这里配置的中间件,还有就是启动框架的各种服务
    //因为该文件内容较多就不展示了,可以自己稍微看一下
    class Kernel extends HttpKernel
    {
        //设置了全局中间件
        protected $middleware = [
            IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
            AppHttpMiddlewareVerifyCsrfToken::class,
        ];
    
        //设置了路由中间件
        protected $routeMiddleware = [
            'auth' => AppHttpMiddlewareAuthenticate::class,
            'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
            'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
            'test'=> AppHttpMiddlewareTestMiddleware::class,
            'mi'=> AppHttpMiddlewareMiMiddleware::class,
        ];
    }
    

    结合图片就大致了解,laravel的启动过程.

    通过上面注释文件,估计大多数悟性爆表的同学已经明白整个过程了.还有极少数晕乎少年没有明白.这里再多说几句.

    其实整个流程就三部 全部在index.php这个文件里

    • 启动框架

    这个是由 app.php做到的 并准备好中间 服务待用

    • 创建http内核

    • 响应请求

    展开全文
  • 本文实例讲述了laravel 框架执行流程与原理。分享给大家供大家参考,具体如下: 1.index.php $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\...
  • Laravel框架的运行过程

    2021-10-08 15:07:52
    Laravel框架的入口文件public/index.php <?php /** * Laravel - A PHP Framework For Web Artisans * * @package Laravel * @author Taylor Otwell <taylor@laravel.com> */ define('LARAVEL_...

    Laravel框架的入口文件public/index.php

    <?php
    
    /**
     * Laravel - A PHP Framework For Web Artisans
     *
     * @package  Laravel
     * @author   Taylor Otwell <taylor@laravel.com>
     */
    
    define('LARAVEL_START', microtime(true));
    
    /*
    |--------------------------------------------------------------------------
    | Register The Auto Loader
    |--------------------------------------------------------------------------
    |
    | Composer provides a convenient, automatically generated class loader for
    | our application. We just need to utilize it! We'll simply require it
    | into the script here so that we don't have to worry about manual
    | loading any of our classes later on. It feels great to relax.
    |
    */
    
    require __DIR__.'/../vendor/autoload.php';
    
    /*
    |--------------------------------------------------------------------------
    | Turn On The Lights
    |--------------------------------------------------------------------------
    |
    | We need to illuminate PHP development, so let us turn on the lights.
    | This bootstraps the framework and gets it ready for use, then it
    | will load up this application so that we can run it and send
    | the responses back to the browser and delight our users.
    |
    */
    
    $app = require_once __DIR__.'/../bootstrap/app.php';
    
    /*
    |--------------------------------------------------------------------------
    | Run The Application
    |--------------------------------------------------------------------------
    |
    | Once we have the application, we can handle the incoming request
    | through the kernel, and send the associated response back to
    | the client's browser allowing them to enjoy the creative
    | and wonderful application we have prepared for them.
    |
    */
    
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    
    $response = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    );
    
    $response->send();
    
    $kernel->terminate($request, $response);

    根据作者的注释可以知道这几行代码的作用:

    1. 定义常量记录框架启动时间。
    2. 加载composer包管理器中的自动加载器到当前命名空间(根命名空间)。
    3. 获取一个Application类的实例$app,这个实例继承了Container类,并且作为一个服务容器承担连接各种服务的功能,我们可以从这个容器获取各种服务,如日志、数据库、缓存、事件等。
    4. 调用$app的make方法获取一个kernel类,用kernel类处理请求对象(Request类的实例,包含了请求信息),之后返回一个$response来发送响应,最后调用$kernel的terminate方法结束本次请求,这样,一个完整的http请求就完成了。

            框架的启动过程在kernel调用handle方法时进行,那么启动框架到底做了什么事情?这就要深入了解下kernel类的handle方法了。
    找到kernel类文件中的handle 方法:

    /**
         * Handle an incoming HTTP request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        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 Events\RequestHandled($request, $response)
            );
    
            return $response;
        }

             这个方法接受一个\Illuminate\Http\Request请求类实例作为参数,然后返回一个\Illuminate\Http\Response响应类。正常请求会调用sendRequestThroughRouter方法,翻过过来就是:“将请求送往路由”,然后返回响应,如果产生异常则调用异常处理方法,将异常信息包装为响应类。接下来看下sendRequestThroughRouter方法:

    /**
         * Send the given request through the middleware / router.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        protected function sendRequestThroughRouter($request)
        {
            $this->app->instance('request', $request);
    
            Facade::clearResolvedInstance('request');
    
            $this->bootstrap();
    
            return (new Pipeline($this->app))
                        ->send($request)
                        ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                        ->then($this->dispatchToRouter());
        }

    这个方法并不长,只有四行代码:

    1. 调用服务容器的instance方法绑定一个request实例
    2. 调用Illuminate\Support\Facades\Facade类(门面类基类)的clearResolvedInstance静态方法清除resolvedInstance属性(已解析实例)中的’request’实体。
    3. 调用bootstrap方法启动框架。
    4. new一个管道类,依次调用send、through、then方法使请求通过中间件,最后分发到路由类处理。

     看到这里,就知道框架的启动过程放在了bootstrap方法,继续看下这个方法:

    /**
         * Bootstrap the application for HTTP requests.
         *
         * @return void
         */
        public function bootstrap()
        {
            if (! $this->app->hasBeenBootstrapped()) {
                $this->app->bootstrapWith($this->bootstrappers());
            }
        }

            判断框架是否启动,未启动则调用服务容器的bootstrapWith方法,传入了kernel的bootstrappers 属性,这个属性是一个数组,数组的键值是类名,这些是在框架启动之时需要注入的类,如管理环境变量、框架配置的类,处理异常类,注册门面类,启动服务类。

    protected $bootstrappers = [
            \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
            \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
            \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
            \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
            \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
            \Illuminate\Foundation\Bootstrap\BootProviders::class,
        ];

    继续看下服务容器的bootstrapWith方法:

    /**
         * Run the given array of bootstrap classes.
         *
         * @param  string[]  $bootstrappers
         * @return void
         */
        public function bootstrapWith(array $bootstrappers)
        {
            $this->hasBeenBootstrapped = true;
    
            foreach ($bootstrappers as $bootstrapper) {
                $this['events']->dispatch('bootstrapping: '.$bootstrapper, [$this]);
    
                $this->make($bootstrapper)->bootstrap($this);
    
                $this['events']->dispatch('bootstrapped: '.$bootstrapper, [$this]);
            }
        }
    

            在这个方法中只有几行代码,将启动属性修改为已启动,然后遍历bootstrappers 数组,启动框架的过程就是一个加载基础类的过程:发布启动事件,调用make方法实例化基础类然后调用基础类的bootstrap方法,然后发布完成启动事件。bootstrappers 数组中的类都定义在laravel源码包 的Foundation目录的子目录Bootstrap中。这些类的功能:

    1. 加载环境变量
    2. 加载配置文件
    3. 加载异常处理类
    4. 注册门面类
    5. 注册服务提供类
    6. 启动服务类

            以上就是laravel框架的启动全过程,我们在框架启动之后,还未处理请求之前调用一下框架的辅助函数dd()和app()来打印下服务容器对象: 

    protected function sendRequestThroughRouter($request)
        {
            $this->app->instance('request', $request);
    
            Facade::clearResolvedInstance('request');
    
            $this->bootstrap();
    dd(app());
            return (new Pipeline($this->app))
                        ->send($request)
                        ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                        ->then($this->dispatchToRouter());
        }

    打印结果:

    Application {#2 ▼
      #basePath: "/vagrant/www/laravel5.8"
      #hasBeenBootstrapped: true
      #booted: true
      #bootingCallbacks: array:1 [▶]
      #bootedCallbacks: array:1 [▶]
      #terminatingCallbacks: []
      #serviceProviders: array:22 [▶]
      #loadedProviders: array:22 [▶]
      #deferredServices: array:102 [▶]
      #appPath: null
      #databasePath: null
      #storagePath: null
      #environmentPath: null
      #environmentFile: ".env"
      #namespace: null
      #resolved: array:20 [▶]
      #bindings: array:41 [▶]
      #methodBindings: []
      #instances: array:26 [▼
        "path" => "/vagrant/www/laravel5.8/app"
        "path.base" => "/vagrant/www/laravel5.8"
        "path.lang" => "/vagrant/www/laravel5.8/resources/lang"
        "path.config" => "/vagrant/www/laravel5.8/config"
        "path.public" => "/vagrant/www/laravel5.8/public"
        "path.storage" => "/vagrant/www/laravel5.8/storage"
        "path.database" => "/vagrant/www/laravel5.8/database"
        "path.resources" => "/vagrant/www/laravel5.8/resources"
        "path.bootstrap" => "/vagrant/www/laravel5.8/bootstrap"
        "app" => Application {#2}
        "Illuminate\Container\Container" => Application {#2}
        "Illuminate\Foundation\PackageManifest" => PackageManifest {#5 ▶}
        "events" => Dispatcher {#27 ▶}
        "router" => Router {#26 ▶}
        "Illuminate\Contracts\Http\Kernel" => Kernel {#30 ▶}
        "request" => Request {#43 ▶}
        "config" => Repository {#34 ▶}
        "db.factory" => ConnectionFactory {#53 ▶}
        "db" => DatabaseManager {#37 ▶}
        "view.engine.resolver" => EngineResolver {#105 ▶}
        "files" => Filesystem {#111}
        "view" => Factory {#112 ▶}
        "translation.loader" => FileLoader {#119 ▶}
        "translator" => Translator {#120 ▶}
        "routes" => RouteCollection {#29 ▶}
        "url" => UrlGenerator {#128 ▶}
      ]
      #aliases: array:66 [▶]
      #abstractAliases: array:36 [▶]
      #extenders: []
      #tags: []
      #buildStack: []
      #with: []
      +contextual: array:1 [▶]
      #reboundCallbacks: array:2 [▶]
      #globalResolvingCallbacks: []
      #globalAfterResolvingCallbacks: []
      #resolvingCallbacks: array:1 [▶]
      #afterResolvingCallbacks: array:1 [▶]
    }

            可以看到在处理请求之前,服务容器中的instances共享实例属性,就已经注册了十几个对象,而在处理请求的过程中又还要注册很多对象,这也就不难理解为什么laravel框架的并发性较差了。

    展开全文
  • 搭建Laravel框架流程

    千次阅读 2014-10-23 18:51:50
    1.搭建LAMP: 安装apache2:sudo apt-get install ...10.打开laravel主目录(composer.josn目录)运行:composer install 自动安装文件 11.输入127.0.0.1/laravel/public得到图: you have arrived

    1.搭建LAMP:

    安装apache2:sudo apt-get install apache2

    安装php5:          sudo apt-get install php5

    安装(配置APACHE+PHP):apt-get install libapache2-mod-php5

    安装mysql: apt-get install mysql-server

    安装(apache、php支持 mysql):apt-get install libapache2-mod-auth-mysql

    安装php5-mysql:            apt-get install php5-mysql


    2.升级php5至php5.5高版本:

    sudo add-apt-repository ppa:ondrej/php5  
    sudo apt-get update  
    sudo apt-get upgrade
    sudo apt-get install php5

    3.安装 mcypt php extension

    apt-get install php5-mcrypt php5-dev
    3.1将配置文件链接给 PHP(有就不用了)
    
    ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available
    3.2开启Mcrypt模块:
     php5enmod mcrypt
    4.配置apche: vi/etc/apache2/apache2.conf 把None改成All 把denied改成granted
                 cd /etc/apache2/sites-available
                 vi 000-default.conf
                 把DocumentRoot /var/www/html 去掉/html
    5.开启apache2 rewrite功能:a2enmod rewrite
    6.开启php管理:a2enmod php5(相当与php-fpm)
    
    7.下载composer.phar
    8.下载laravel包,解压包到/var/www/下
    9.cp composer.phar composer,把composer改成composer
    10.打开laravel主目录(composer.josn目录)运行:composer install
       自动安装文件
    11.输入127.0.0.1/laravel/public得到图:
    Laravel PHP Frameworkyou have arrived
    



    展开全文
  • laravel5.6流程

    2018-09-11 14:04:52
    laravel5.6流程!!
  • 主要介绍了Laravel框架生命周期与原理,结合实例形式总结分析了Laravel框架针对用户请求响应的完整运行周期、流程、原理,需要的朋友可以参考下
  • 主要介绍了Laravel框架实现修改登录和注册接口数据返回格式的方法,结合实例形式分析了Laravel框架针对登录与注册接口数据操作流程、原理与修改操作实现方法,需要的朋友可以参考下
  • PHP-laravel框架学习笔记

    万次阅读 2021-03-22 14:14:05
    Laravel 是灵活的 php web 开发框架,tp5 和 laravel 有一定相似之处 ...安装 首先安装 composer,进入目录打开 cmd,执行命令即可 composer create-project laravel/laravel=5.6....laravel 同样属于 mvc 框架Laravel
  • laravel启动流程

    2020-03-17 12:10:21
    1. 用户请求index.... 服务提供者负责启动框架需要的各种组件,包括数据库、队列、验证、路由。 8.服务容器启动后,并且服务提供者注册后,Request对象被交给路由。路由会把request再交给一个指定 的路由或控制器。
  • Laravel框架执行流程

    千次阅读 2017-04-13 15:37:09
    俗话说知己知彼百战不怠,使用Laravel也有有一段时间了,中间也踩了很多坑,碰了很多壁,归根结底还是对Laravel的底层不太了解,以前使用Thinkphp养成的MVC的习惯,刚接触Laravel一...研究了下Laravel框架的执行流程
  • Laravel 框架的入口文件 index.php 1、引入自动加载 autoload.php 文件 2、创建应用实例,并同时完成了 基本绑定($this、容器类Container等等)、 基本服务提供者的注册(Event、log、routing)、 核心类别名的注册...
  • 基于PHP+MySQL 的Laravel 框架技术,分析电子商务新模式威客系统平台认知的要求和流程,设计电商威客平台的 功能模块以及数据库,应用PHP 编程实现B/S 架构的电商威客平台系统
  • Laravel框架的体系结构

    2021-05-07 07:34:27
    Laravel被称为“全栈”式框架,因为它...Laravel附带了一个名为Artisan的优秀的命令行工具,它提供了一些开发过程中有用的命令用,可以用来生成框架代码和数据库管理。它是基于强大的Symfony Console 组件开发的。...
  • laravel框架思维导图

    2020-03-17 15:00:13
    : 链接 长方形 圆 圆角长方形 菱形 关于 Mermaid 语法,参考 这儿, FLowchart流程图 我们依旧会支持flowchart的流程图: Created with Raphaël 2.2.0开始我的操作确认?结束yesno 关于 Flowchart流程图 语法,参考 ...
  • 1.下载扩展 composer require firebase/php-jwt 2. 封装生成TOKEN,解密TOKEN的方法 USE 引入刚刚下载的类 use Firebase\JWT\JWT; 封装 //生成TOKEN public function getToken($user_id) ...$key, //签..
  • 这里将看看laravel执行的流程。 一.入口文件 Laravel 应用的所有请求入口都是public/index.php文件。 index.php里面其实就几行代码。 // 1.定义个laravel开始时间的常量,微秒数 define('LARAVEL_START', ...
  • laravel框架基础知识

    2019-10-03 07:28:14
    一、laravel简介 laravel是一套优雅简介的PHP开发框架,受欢迎程度非常之高,...本篇学习笔记以laravel5.2.15版本为框架的版本基础;更多版本请移步https://www.golaravel.com/ 三、laravel下载安装以及开发环境...
  • 1. if - else {{-- if - else--}} @if ($name == 'sean') I'm sean @elseif ($name == 'immoc') I'm imocc @else who am I? @endif {{-- if 中也可以使用php语法--}} @if (in_array($name, $arr)) ... .
  • Laravel框架开发规范

    2020-08-14 14:58:01
    文章目录扩展包配置信息与环境变量辅助函数代码风格路由器模型控制器表单验证Artisan命令行日期函数中间件注意事项关闭 DEBUG开发流程 扩展包 我们都知道 Laravel 扩展包的注册会对应用造成消耗。有一些扩展包是开发...
  • 关于laravel框架我的心得

    千次阅读 2018-06-15 15:10:23
    laravel框架在我看来是非常简洁,优雅的开发框架。让我更好的有一次理解的一些思想,说真的。在写自己的项目中,起初有一点点的不顺,后来还好。laravel框架的安全系数让我感到很高,里面有很多值得继续研究的部分。...
  • Laravel最初的设计是...本文我们将分析一下laravel框架的核心架构。 主要包含的内容有:容器、应用框架、内核、契约、入口文件、服务提供者、路由、门面。 laravel框架的架构模式(设计核心,laravel 框架是使用服务
  • Laravel框架深入探索-入口文件

    千次阅读 2019-10-01 14:29:30
    这一系列文章旨在对Laravel框架进行深入的解析,了解和揭示框架本身的内在实现机制,以便更好地指导我们对框架的使用。 入口文件 基于Laravel框架开发的应用,对Web Server来说,和普通应用并无区别。所以当Web ...
  • 1.使用DB门面进行基本操作一旦你设置好了数据库连接,就可以使用 DB facade 来进行查找。DB facade 提供每个类型的查找方法:select、update、insert、delete、statement。1.1增->DB::insert(‘insert into users...
  • 流程概述:利用微信小程序自带的wx.uploadFile方法,将文件post 到服务器API接口,接受内容,保存image.png为什么实例里边没有将 content-type 为 multipart/form-data 放进去呢,想不懂image.png直接上代码js 文件/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,419
精华内容 1,367
关键字:

laravel框架流程