关闭

Laravel源码解析一 【请求的生命周期】

标签: 源码框架Laravel
1956人阅读 评论(0) 收藏 举报
分类:

不BB,直接开始。
看一个框架的源码,第一步我们先看入口文件。
laravel的入口文件在public目录下的index.php

require __DIR__.'/../bootstrap/autoload.php';

这玩意是加载composer的一些东西,自动加载有需要的类。具体的也不多说,主要是我还没玩会这玩意。
接着看

$app = require_once __DIR__.'/../bootstrap/app.php';

这里要看bootstrap目录下的app.php文件
这个文件里映入眼帘的就是

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

好吧。new一个application出来。那么我们找到Illuminate\Foundation\Application这个文件

public function __construct($basePath = null)
    {
        $this->registerBaseBindings();

        $this->registerBaseServiceProviders();

        $this->registerCoreContainerAliases();

        if ($basePath) {
            $this->setBasePath($basePath);
        }
    }

new application时的构造函数长这个样子。写到这的时候,我突然觉得加个序号可能会比较好。

(一) new Application的过程

1.1先是注册基本绑定,也就是 $this->registerBaseBindings();这个方法里的内容

protected function registerBaseBindings()
    {
        static::setInstance($this);

        $this->instance('app', $this);

        $this->instance('Illuminate\Container\Container', $this);

    }

巨简单的过程,就是把实例化的的application 赋值给app和Illuminate\Container\Container

1.2注册基本的服务提供者。$this->registerBaseServiceProviders();

protected function registerBaseServiceProviders()
    {
        $this->register(new EventServiceProvider($this));

        $this->register(new RoutingServiceProvider($this));
    }

这里通过名字可以感觉出是注册了事件服务提供者和路由服务提供者

1.3注册核心类名的别名$this->registerCoreContainerAliases();

public function registerCoreContainerAliases()
    {
        $aliases = [
            'app'                  => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application'],
            'auth'                 => ['Illuminate\Auth\AuthManager', 'Illuminate\Contracts\Auth\Factory'],
            'auth.driver'          => ['Illuminate\Contracts\Auth\Guard'],
            'blade.compiler'       => ['Illuminate\View\Compilers\BladeCompiler'],
            'cache'                => ['Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory'],
            'cache.store'          => ['Illuminate\Cache\Repository', 'Illuminate\Contracts\Cache\Repository'],
            'config'               => ['Illuminate\Config\Repository', 'Illuminate\Contracts\Config\Repository'],
            'cookie'               => ['Illuminate\Cookie\CookieJar', 'Illuminate\Contracts\Cookie\Factory', 'Illuminate\Contracts\Cookie\QueueingFactory'],
            'encrypter'            => ['Illuminate\Encryption\Encrypter', 'Illuminate\Contracts\Encryption\Encrypter'],
            'db'                   => ['Illuminate\Database\DatabaseManager'],
            'db.connection'        => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'],
            'events'               => ['Illuminate\Events\Dispatcher', 'Illuminate\Contracts\Events\Dispatcher'],
            'files'                => ['Illuminate\Filesystem\Filesystem'],
            'filesystem'           => ['Illuminate\Filesystem\FilesystemManager', 'Illuminate\Contracts\Filesystem\Factory'],
            'filesystem.disk'      => ['Illuminate\Contracts\Filesystem\Filesystem'],
            'filesystem.cloud'     => ['Illuminate\Contracts\Filesystem\Cloud'],
            'hash'                 => ['Illuminate\Contracts\Hashing\Hasher'],
            'translator'           => ['Illuminate\Translation\Translator', 'Symfony\Component\Translation\TranslatorInterface'],
            'log'                  => ['Illuminate\Log\Writer', 'Illuminate\Contracts\Logging\Log', 'Psr\Log\LoggerInterface'],
            'mailer'               => ['Illuminate\Mail\Mailer', 'Illuminate\Contracts\Mail\Mailer', 'Illuminate\Contracts\Mail\MailQueue'],
            'auth.password'        => ['Illuminate\Auth\Passwords\PasswordBrokerManager', 'Illuminate\Contracts\Auth\PasswordBrokerFactory'],
            'auth.password.broker' => ['Illuminate\Auth\Passwords\PasswordBroker', 'Illuminate\Contracts\Auth\PasswordBroker'],
            'queue'                => ['Illuminate\Queue\QueueManager', 'Illuminate\Contracts\Queue\Factory', 'Illuminate\Contracts\Queue\Monitor'],
            'queue.connection'     => ['Illuminate\Contracts\Queue\Queue'],
            'queue.failer'         => ['Illuminate\Queue\Failed\FailedJobProviderInterface'],
            'redirect'             => ['Illuminate\Routing\Redirector'],
            'redis'                => ['Illuminate\Redis\Database', 'Illuminate\Contracts\Redis\Database'],
            'request'              => ['Illuminate\Http\Request', 'Symfony\Component\HttpFoundation\Request'],
            'router'               => ['Illuminate\Routing\Router', 'Illuminate\Contracts\Routing\Registrar'],
            'session'              => ['Illuminate\Session\SessionManager'],
            'session.store'        => ['Illuminate\Session\Store', 'Symfony\Component\HttpFoundation\Session\SessionInterface'],
            'url'                  => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
            'validator'            => ['Illuminate\Validation\Factory', 'Illuminate\Contracts\Validation\Factory'],
            'view'                 => ['Illuminate\View\Factory', 'Illuminate\Contracts\View\Factory'],
        ];

        foreach ($aliases as $key => $aliases) {
            foreach ($aliases as $alias) {
                $this->alias($key, $alias);
            }
        }
    }

这个方法更简单,就是一个别名数组,然后通过for循环调用$this->alias()给Application类的父类Container里的aliases数组里。

1.4设置基本路径,我们在new Application时传入的 realpath(DIR.’/../’)这个参数赋值给基本路径

(二)注册共享的Kernel和异常处理器

我们的app也new好了,我们接着app.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.php最后返回的是app实例

(三)处理请求和响应

app.php文件执行完以后回到index.php 可以看到

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

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

$response->send();

$kernel->terminate($request, $response);

3.1解析Illuminate\Contracts\Http\Kernel,实例化App\Http\Kernel

3.2实例化后的kernel处理本次请求。这里$kernel->handle()传入的参数是一个request。
这里的request是经过Symfony封装的请求对象。讲道理看到这的时候我有点懵逼。卧槽,我刚开始学laravel,还没整明白呢,就又多了一个Symfony要学,至少得了解怎么封装的请求对象。好烦呀。。。

3.3是将请求处理后的返回结果发送到浏览器里

3.4处理继承自TerminableMiddleware接口的中间件(Session)并结束应用生命周期。

以上就是laravel框架里执行一次请求所要经历的生命周期。
具体的如何注册如何加载如何封装请求,我会随着自己知识的积累和分析源码来做出解答。
顺便,我也是刚开始学习laravel。一起加油!

0
0
查看评论

新手解读:laravel 框架源码分析(一)

众所周知,php的框架数不胜数,近几年,一个以优雅著称的框架,渐渐被国内phper所知道,并且开始使用,但是larave有一个很明显的缺点就是,他的文档内容少的可怜。而且国内的社区也不是很活跃。所以对使用这款框架的新书造成了很大困难。 作者作为一个入门也没多久的新手,尝试着从自己的角度,剖析一下这...
  • jackqth
  • jackqth
  • 2016-11-06 11:48
  • 5296

Laravel 5.1 源码阅读笔记

Laravel 5.1 源码阅读笔记,主要涉及入口文件、Kernel、Application、Pipeline、Middleware、Router、Request、Response、Bootstrap等等。
  • liigo
  • liigo
  • 2015-11-05 18:04
  • 8735

laravel中间件源码分析

转载自:http://www.cnblogs.com/z1298703836/p/5241541.html laravel中间件源码分析 在laravel5.2中,HTTP 中间件为过滤访问你的应用的 HTTP 请求提供了一个方便的机制。在处理逻辑之前,会通过中间件...
  • xiao_tommy
  • xiao_tommy
  • 2016-11-24 08:19
  • 457

Laravel 源码解读

本文转载于:http://yuez.me/laravel-yuan-ma-jie-du/?utm_source=tuicool&utm_medium=referral Laravel 源码解读 为WEB艺术家创造的框架 由SitePoint发起的2015年最流行WEB...
  • u011816231
  • u011816231
  • 2016-07-06 14:18
  • 13268

laravel 5.1 查询底层原理 (Query Builder) 源码解析(上)

原文地址 说明:本文主要学习Laravel Database模块的Query Builder源码。实际上,Laravel通过Schema Builder来设计数据库,通过Query Builder来CURD数据库。Query Builder并不复杂或神秘,只是在PDO扩展的基础上又开放...
  • woshihaiyong168
  • woshihaiyong168
  • 2017-05-11 20:11
  • 558

给大家推荐一个很好用的Laravel框架的源码,October CMS

源码下载网址:https://github.com/octobercms/october 英文不好的朋友可以用谷歌浏览器打开。翻译成中文。 并打开安装指南进行安装。。。 按照这里的安装向导进行安装。 安装好以后就可以在后台进行一些操作,比如要新增一个页面。 就只需要在这里点击增...
  • ougexingfuba
  • ougexingfuba
  • 2017-07-25 14:17
  • 673

辛星解读laravel源代码第一篇即Database的实现流程

经过一天左右的努力,终于把laravel的源代码整合到了yaf框架上面,下面说一下laravel的db层的一些处理吧,我使用的是laravel5.1.4,下面是database所在的位置:laravel5.1.4/vendor/laravel/framework/src/Illuminate/Dat...
  • xinguimeng
  • xinguimeng
  • 2015-08-25 18:18
  • 3577

laravel商城项目源码

  • 2017-04-24 13:56
  • 39.24MB
  • 下载

Laravel5.5源码详解 -- Auth中间件

Laravel5.5源码详解 – Auth中间件为了体现全貌,前面的代码部分没有做太多删减,重点关注特别加入的注释部分。原文的注释删除,以减少阅读篇幅。本文重点在后面的流程讲解,这些比较详细。如果光看官方的文档,碰到问题的时候往往还是不知所云。所以,熟练的运用,应该建立在对源码的深刻了解的基础上。而...
  • tanmx219
  • tanmx219
  • 2017-12-28 15:32
  • 327

Laravel5.5源码详解 -- 一次查询的详细执行:从Auth-Login-web中间件到数据库查询结果的全过程

Laravel5.5源码分析 – 一次查询的详细执行:从Auth-Login-web中间件到数据库查询结果的全过程因为没时间做太多整理,只是详细记录了一下事整个查询语句执行的全过程,更多的信息待有时间再整理。在我的Controller中,源代码是这样的,$flag = Auth::guard(...
  • tanmx219
  • tanmx219
  • 2017-12-26 12:11
  • 208
    个人资料
    • 访问:26258次
    • 积分:421
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:0篇
    • 译文:0篇
    • 评论:25条
    文章分类
    最新评论