Table of Contents
laravel5源码讲解整理,laravel5源码讲解
来源:http://yuez.me/laravel-yuan-ma-jie-du/?utm_source=tuicool&utm_medium=referral
目录
入口文件 index.php
Laravel源码解读-index.php (laravel_index.php)download
Illuminate\Foundation\Application 类
Laravel源码解读-app.php (laravel_app.php)download
Illuminate\Foundation\Application 构造方法
Illuminate\Foundation\Application#registerBaseBindings
Illuminate\Container\Container#instance
Illuminate\Foundation\Application#registerBaseServiceProviders
注入所有基础 Service Provider
Illuminate\Events\EventServiceProvider#register
Illuminate\Routing\RoutingServiceProvider#register
Home php教程 php手册 laravel5源码讲解整理,laravel5源码讲解

laravel5源码讲解整理,laravel5源码讲解

Jun 13, 2016 am 08:51 AM
http tidy source Source code explain

laravel5源码讲解整理,laravel5源码讲解

来源:http://yuez.me/laravel-yuan-ma-jie-du/?utm_source=tuicool&utm_medium=referral

目录

  • 入口文件 index.php
    • Illuminate\Foundation\Application 类
    • 注入所有基础 Service Provider

 

入口文件 index.php

一个基于Laravel的应用,当WEB服务器接受到来自外部的请求后,会将这个这个请求解析到 应用根目录的 public/index.php 中。

Laravel源码解读-index.php (laravel_index.php)download

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
<span class="line-number">15
<span class="line-number">16
<span class="line-number">17
<span class="line-number">18
<span class="line-number">19
<span class="line-number">20
<span class="line-number">21
<span class="line-number">22
<span class="line-number">23
<span class="line-number">24
<span class="line-number">25
<span class="line-number">26
<span class="line-number">27
<span class="line-number">28
<span class="line-number">29
<span class="line-number">30
<span class="line-number">31
<span class="line-number">32
<span class="line-number">33
<span class="line-number">34
<span class="line-number">35
<span class="line-number">36
<span class="line-number">37
<span class="line-number">38
<span class="line-number">39
<span class="line-number">40
<span class="line-number">41
<span class="line-number">42
<span class="line-number">43
<span class="line-number">44
<span class="line-number">45
<span class="line-number">46
<span class="line-number">47
<span class="line-number">48
<span class="line-number">49
<span class="line-number">50
<span class="line-number">51
<span class="line-number">52
<span class="line-number">53
<span class="line-number">54
<span class="line-number">55
<span class="line-number">56
<span class="line-number">57
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="o"><?<span class="nx">php
<span class="line"><span class="sd">/**
<span class="line"><span class="sd"> * Laravel - A PHP Framework For Web Artisans
<span class="line"><span class="sd"> *
<span class="line"><span class="sd"> * @package  Laravel
<span class="line"><span class="sd"> * @author   Taylor Otwell <taylorotwell@gmail.com>
<span class="line"><span class="sd"> */
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Register The Auto Loader
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| Composer provides a convenient, automatically generated class loader for
<span class="line"><span class="cm">| our application. We just need to utilize it! We'll simply require it
<span class="line"><span class="cm">| into the script here so that we don't have to worry about manual
<span class="line"><span class="cm">| loading any of our classes later on. It feels nice to relax.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="k">require <span class="nx">__DIR__<span class="o">.<span class="s1">'/../bootstrap/autoload.php'<span class="p">;
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Turn On The Lights
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| We need to illuminate PHP development, so let us turn on the lights.
<span class="line"><span class="cm">| This bootstraps the framework and gets it ready for use, then it
<span class="line"><span class="cm">| will load up this application so that we can run it and send
<span class="line"><span class="cm">| the responses back to the browser and delight our users.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="nv">$app <span class="o">= <span class="k">require_once <span class="nx">__DIR__<span class="o">.<span class="s1">'/../bootstrap/app.php'<span class="p">;
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Run The Application
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| Once we have the application, we can handle the incoming request
<span class="line"><span class="cm">| through the kernel, and send the associated response back to
<span class="line"><span class="cm">| the client's browser allowing them to enjoy the creative
<span class="line"><span class="cm">| and wonderful application we have prepared for them.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="nv">$kernel <span class="o">= <span class="nv">$app<span class="o">-><span class="na">make<span class="p">(<span class="nx">Illuminate\Contracts\Http\Kernel<span class="o">::<span class="na">class<span class="p">);
<span class="line">
<span class="line"><span class="nv">$response <span class="o">= <span class="nv">$kernel<span class="o">-><span class="na">handle<span class="p">(
<span class="line">    <span class="nv">$request <span class="o">= <span class="nx">Illuminate\Http\Request<span class="o">::<span class="na">capture<span class="p">()
<span class="line"><span class="p">);
<span class="line">
<span class="line"><span class="nv">$response<span class="o">-><span class="na">send<span class="p">();
<span class="line">
<span class="line"><span class="nv">$kernel<span class="o">-><span class="na">terminate<span class="p">(<span class="nv">$request<span class="p">, <span class="nv">$response<span class="p">);
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

第二十一行代码

<span class="line-number">1
</span>
Copy after login
Copy after login
<code class="php"><span class="line"><span class="k">require <span class="nx">__DIR__<span class="o">.<span class="s1">'/../bootstrap/autoload.php'<span class="p">;
</span></span></span></span></span></span></code>
Copy after login

为Laravel应用引入了由Composer提供的类加载器,这样Laravel应用便无需再手动加载任 何的类。其加载原理不是此次探究的目标,所以仅仅这样使用就好了。接下的代码,便是重 点。

Illuminate\Foundation\Application 类

该类的继承结构如下:

第三十五行代码

<span class="line-number">1
</span>
Copy after login
Copy after login
<code class="php"><span class="line"><span class="nv">$app <span class="o">= <span class="k">require_once <span class="nx">__DIR__<span class="o">.<span class="s1">'/../bootstrap/app.php'<span class="p">;
</span></span></span></span></span></span></span></span></code>
Copy after login

它将我的视线引入到了另外一个文件中,去看看到底发生了什么吧。

Laravel源码解读-app.php (laravel_app.php)download

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
<span class="line-number">15
<span class="line-number">16
<span class="line-number">17
<span class="line-number">18
<span class="line-number">19
<span class="line-number">20
<span class="line-number">21
<span class="line-number">22
<span class="line-number">23
<span class="line-number">24
<span class="line-number">25
<span class="line-number">26
<span class="line-number">27
<span class="line-number">28
<span class="line-number">29
<span class="line-number">30
<span class="line-number">31
<span class="line-number">32
<span class="line-number">33
<span class="line-number">34
<span class="line-number">35
<span class="line-number">36
<span class="line-number">37
<span class="line-number">38
<span class="line-number">39
<span class="line-number">40
<span class="line-number">41
<span class="line-number">42
<span class="line-number">43
<span class="line-number">44
<span class="line-number">45
<span class="line-number">46
<span class="line-number">47
<span class="line-number">48
<span class="line-number">49
<span class="line-number">50
<span class="line-number">51
<span class="line-number">52
<span class="line-number">53
<span class="line-number">54
<span class="line-number">55
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="o"><?<span class="nx">php
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Create The Application
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| The first thing we will do is create a new Laravel application instance
<span class="line"><span class="cm">| which serves as the "glue" for all the components of Laravel, and is
<span class="line"><span class="cm">| the IoC container for the system binding all of the various parts.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="nv">$app <span class="o">= <span class="k">new <span class="nx">Illuminate\Foundation\Application<span class="p">(
<span class="line">    <span class="nb">realpath<span class="p">(<span class="nx">__DIR__<span class="o">.<span class="s1">'/../'<span class="p">)
<span class="line"><span class="p">);
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Bind Important Interfaces
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| Next, we need to bind some important interfaces into the container so
<span class="line"><span class="cm">| we will be able to resolve them when needed. The kernels serve the
<span class="line"><span class="cm">| incoming requests to this application from both the web and CLI.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="nv">$app<span class="o">-><span class="na">singleton<span class="p">(
<span class="line">    <span class="nx">Illuminate\Contracts\Http\Kernel<span class="o">::<span class="na">class<span class="p">,
<span class="line">    <span class="nx">App\Http\Kernel<span class="o">::<span class="na">class
<span class="line"><span class="p">);
<span class="line">
<span class="line"><span class="nv">$app<span class="o">-><span class="na">singleton<span class="p">(
<span class="line">    <span class="nx">Illuminate\Contracts\Console\Kernel<span class="o">::<span class="na">class<span class="p">,
<span class="line">    <span class="nx">App\Console\Kernel<span class="o">::<span class="na">class
<span class="line"><span class="p">);
<span class="line">
<span class="line"><span class="nv">$app<span class="o">-><span class="na">singleton<span class="p">(
<span class="line">    <span class="nx">Illuminate\Contracts\Debug\ExceptionHandler<span class="o">::<span class="na">class<span class="p">,
<span class="line">    <span class="nx">App\Exceptions\Handler<span class="o">::<span class="na">class
<span class="line"><span class="p">);
<span class="line">
<span class="line"><span class="cm">/*
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">| Return The Application
<span class="line"><span class="cm">|--------------------------------------------------------------------------
<span class="line"><span class="cm">|
<span class="line"><span class="cm">| This script returns the application instance. The instance is given to
<span class="line"><span class="cm">| the calling script so we can separate the building of the instances
<span class="line"><span class="cm">| from the actual running of the application and sending responses.
<span class="line"><span class="cm">|
<span class="line"><span class="cm">*/
<span class="line">
<span class="line"><span class="k">return <span class="nv">$app<span class="p">;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

看第十四行,原来$app是一个 Illuminate\Foundation\Application 对象,那么在创 建这个对象的时候又发生了什么呢?

从它的构造方法看起:

Illuminate\Foundation\Application 构造方法

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
<span class="line-number">15
<span class="line-number">16
<span class="line-number">17
<span class="line-number">18
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="sd">/**
<span class="line"><span class="sd"> * Create a new Illuminate application instance.
<span class="line"><span class="sd"> *
<span class="line"><span class="sd"> * @param  string|null  $basePath
<span class="line"><span class="sd"> * @return void
<span class="line"><span class="sd"> */
<span class="line"><span class="k">public <span class="k">function <span class="nf">__construct<span class="p">(<span class="nv">$basePath <span class="o">= <span class="k">null<span class="p">)
<span class="line"><span class="p">{
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerBaseBindings<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerBaseServiceProviders<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerCoreContainerAliases<span class="p">();
<span class="line">
<span class="line">    <span class="k">if <span class="p">(<span class="nv">$basePath<span class="p">) <span class="p">{
<span class="line">        <span class="nv">$this<span class="o">-><span class="na">setBasePath<span class="p">(<span class="nv">$basePath<span class="p">);
<span class="line">    <span class="p">}
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

顺着函数调用,往下看。在这个构造函数中,首先调用了registerBaseBindings方法。

Illuminate\Foundation\Application#registerBaseBindings

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
</span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="sd">/**
<span class="line"><span class="sd">  * Register the basic bindings into the container.
<span class="line"><span class="sd">  *
<span class="line"><span class="sd">  * @return void
<span class="line"><span class="sd">  */
<span class="line"><span class="k">protected <span class="k">function <span class="nf">registerBaseBindings<span class="p">()
<span class="line"><span class="p">{
<span class="line">    <span class="k">static<span class="o">::<span class="na">setInstance<span class="p">(<span class="nv">$this<span class="p">);
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">instance<span class="p">(<span class="s1">'app'<span class="p">, <span class="nv">$this<span class="p">);
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">instance<span class="p">(<span class="s1">'Illuminate\Container\Container'<span class="p">, <span class="nv">$this<span class="p">);
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

这段代码,是将实例对象注入到容器中。那么,这个容器是什么呢?答案还是要从这段调用 中去寻找。

static::setInstance($this) 所做的就是将 $this 赋值给自身的 instance 静态变 量。重点看 $this->instance('app', $this)

instance 函数的作用是绑定一个已有对象到容器中,这个对象在容器中共享并且可以通 过键获取。

Illuminate\Container\Container#instance

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
<span class="line-number">15
<span class="line-number">16
<span class="line-number">17
<span class="line-number">18
<span class="line-number">19
<span class="line-number">20
<span class="line-number">21
<span class="line-number">22
<span class="line-number">23
<span class="line-number">24
<span class="line-number">25
<span class="line-number">26
<span class="line-number">27
<span class="line-number">28
<span class="line-number">29
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="sd">/**
<span class="line"><span class="sd">  * Register an existing instance as shared in the container.
<span class="line"><span class="sd">  *
<span class="line"><span class="sd">  * @param  string  $abstract
<span class="line"><span class="sd">  * @param  mixed   $instance
<span class="line"><span class="sd">  * @return void
<span class="line"><span class="sd">  */
<span class="line"><span class="k">public <span class="k">function <span class="nf">instance<span class="p">(<span class="nv">$abstract<span class="p">, <span class="nv">$instance<span class="p">)
<span class="line"><span class="p">{
<span class="line">    <span class="k">if <span class="p">(<span class="nb">is_array<span class="p">(<span class="nv">$abstract<span class="p">)) <span class="p">{
<span class="line">        <span class="c1">// $abstract 是这样的一个数组 ['actual key' => 'alias']
<span class="line">        <span class="k">list<span class="p">(<span class="nv">$abstract<span class="p">, <span class="nv">$alias<span class="p">) <span class="o">= <span class="nv">$this<span class="o">-><span class="na">extractAlias<span class="p">(<span class="nv">$abstract<span class="p">);
<span class="line">
<span class="line">        <span class="c1">// 实际上的行为是 $this->aliases[$alias] = $abstract;
<span class="line">        <span class="nv">$this<span class="o">-><span class="na">alias<span class="p">(<span class="nv">$abstract<span class="p">, <span class="nv">$alias<span class="p">);
<span class="line">    <span class="p">}
<span class="line">
<span class="line">    <span class="nb">unset<span class="p">(<span class="nv">$this<span class="o">-><span class="na">aliases<span class="p">[<span class="nv">$abstract<span class="p">]);
<span class="line">
<span class="line">    <span class="c1">// 检查是否有这个键是否已经注册到容器中
<span class="line">    <span class="c1">// $bound 是一个boolean值
<span class="line">    <span class="nv">$bound <span class="o">= <span class="nv">$this<span class="o">-><span class="na">bound<span class="p">(<span class="nv">$abstract<span class="p">);
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">instances<span class="p">[<span class="nv">$abstract<span class="p">] <span class="o">= <span class="nv">$instance<span class="p">;
<span class="line">
<span class="line">    <span class="k">if <span class="p">(<span class="nv">$bound<span class="p">) <span class="p">{
<span class="line">        <span class="nv">$this<span class="o">-><span class="na">rebound<span class="p">(<span class="nv">$abstract<span class="p">);
<span class="line">    <span class="p">}
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

视线重新回到Application类中,接下来调用了这个方法 $this->registerBaseServiceProviders()

Illuminate\Foundation\Application#registerBaseServiceProviders

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
<span class="line-number">15
<span class="line-number">16
<span class="line-number">17
<span class="line-number">18
<span class="line-number">19
<span class="line-number">20
<span class="line-number">21
<span class="line-number">22
<span class="line-number">23
<span class="line-number">24
<span class="line-number">25
<span class="line-number">26
<span class="line-number">27
<span class="line-number">28
<span class="line-number">29
<span class="line-number">30
<span class="line-number">31
<span class="line-number">32
<span class="line-number">33
<span class="line-number">34
<span class="line-number">35
<span class="line-number">36
<span class="line-number">37
<span class="line-number">38
<span class="line-number">39
<span class="line-number">40
<span class="line-number">41
<span class="line-number">42
<span class="line-number">43
<span class="line-number">44
<span class="line-number">45
<span class="line-number">46
<span class="line-number">47
<span class="line-number">48
<span class="line-number">49
<span class="line-number">50
<span class="line-number">51
<span class="line-number">52
<span class="line-number">53
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="sd">/**
<span class="line"><span class="sd">  * Register all of the base service providers.
<span class="line"><span class="sd">  *
<span class="line"><span class="sd">  * @return void
<span class="line"><span class="sd">  */
<span class="line"><span class="k">protected <span class="k">function <span class="nf">registerBaseServiceProviders<span class="p">()
<span class="line"><span class="p">{
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">register<span class="p">(<span class="k">new <span class="nx">EventServiceProvider<span class="p">(<span class="nv">$this<span class="p">));
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">register<span class="p">(<span class="k">new <span class="nx">RoutingServiceProvider<span class="p">(<span class="nv">$this<span class="p">));
<span class="line"><span class="p">}
<span class="line">
<span class="line"><span class="sd">/**
<span class="line"><span class="sd">  * Register a service provider with the application.
<span class="line"><span class="sd">  *
<span class="line"><span class="sd">  * @param  \Illuminate\Support\ServiceProvider|string  $provider
<span class="line"><span class="sd">  * @param  array  $options
<span class="line"><span class="sd">  * @param  bool   $force
<span class="line"><span class="sd">  * @return \Illuminate\Support\ServiceProvider
<span class="line"><span class="sd">  */
<span class="line"><span class="k">public <span class="k">function <span class="nf">register<span class="p">(<span class="nv">$provider<span class="p">, <span class="nv">$options <span class="o">= <span class="p">[], <span class="nv">$force <span class="o">= <span class="k">false<span class="p">)
<span class="line"><span class="p">{
<span class="line">    <span class="k">if <span class="p">(<span class="nv">$registered <span class="o">= <span class="nv">$this<span class="o">-><span class="na">getProvider<span class="p">(<span class="nv">$provider<span class="p">) <span class="o">&& <span class="o">!<span class="nv">$force<span class="p">) <span class="p">{
<span class="line">        <span class="k">return <span class="nv">$registered<span class="p">;
<span class="line">    <span class="p">}
<span class="line">
<span class="line">    <span class="c1">// If the given "provider" is a string, we will resolve it, passing in the
<span class="line">    <span class="c1">// application instance automatically for the developer. This is simply
<span class="line">    <span class="c1">// a more convenient way of specifying your service provider classes.
<span class="line">    <span class="k">if <span class="p">(<span class="nb">is_string<span class="p">(<span class="nv">$provider<span class="p">)) <span class="p">{
<span class="line">        <span class="nv">$provider <span class="o">= <span class="nv">$this<span class="o">-><span class="na">resolveProviderClass<span class="p">(<span class="nv">$provider<span class="p">);
<span class="line">    <span class="p">}
<span class="line">
<span class="line">    <span class="nv">$provider<span class="o">-><span class="na">register<span class="p">();
<span class="line">
<span class="line">    <span class="c1">// Once we have registered the service we will iterate through the options
<span class="line">    <span class="c1">// and set each of them on the application so they will be available on
<span class="line">    <span class="c1">// the actual loading of the service objects and for developer usage.
<span class="line">    <span class="k">foreach <span class="p">(<span class="nv">$options <span class="k">as <span class="nv">$key <span class="o">=> <span class="nv">$value<span class="p">) <span class="p">{
<span class="line">        <span class="nv">$this<span class="p">[<span class="nv">$key<span class="p">] <span class="o">= <span class="nv">$value<span class="p">;
<span class="line">    <span class="p">}
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">markAsRegistered<span class="p">(<span class="nv">$provider<span class="p">);
<span class="line">
<span class="line">    <span class="c1">// If the application has already booted, we will call this boot method on
<span class="line">    <span class="c1">// the provider class so it has an opportunity to do its boot logic and
<span class="line">    <span class="c1">// will be ready for any usage by the developer's application logics.
<span class="line">    <span class="k">if <span class="p">(<span class="nv">$this<span class="o">-><span class="na">booted<span class="p">) <span class="p">{
<span class="line">        <span class="nv">$this<span class="o">-><span class="na">bootProvider<span class="p">(<span class="nv">$provider<span class="p">);
<span class="line">    <span class="p">}
<span class="line">
<span class="line">    <span class="k">return <span class="nv">$provider<span class="p">;
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

其中,EventServiceProvider和RoutingServiceProvider分别是

  • Illuminate\Events\EventServiceProvider
  • Illuminate\Routing\RoutingServiceProvider

这些ServiceProvider是 Illuminate\Support\ServiceProvider 的子类,它接受一个 Application 对象作为构造函数参数,存储在实例变量 $app 中。

注入所有基础 Service Provider

register 方法中,每个ServiceProvider被调用了自身的 register 方法。首先看 看 EventServiceProvider 中的吧。

Illuminate\Events\EventServiceProvider#register

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
</span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="k">public <span class="k">function <span class="nf">register<span class="p">()
<span class="line"><span class="p">{
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">app<span class="o">-><span class="na">singleton<span class="p">(<span class="s1">'events'<span class="p">, <span class="k">function <span class="p">(<span class="nv">$app<span class="p">) <span class="p">{
<span class="line">        <span class="k">return <span class="p">(<span class="k">new <span class="nx">Dispatcher<span class="p">(<span class="nv">$app<span class="p">))<span class="o">-><span class="na">setQueueResolver<span class="p">(<span class="k">function <span class="p">() <span class="k">use <span class="p">(<span class="nv">$app<span class="p">) <span class="p">{
<span class="line">            <span class="k">return <span class="nv">$app<span class="o">-><span class="na">make<span class="p">(<span class="s1">'Illuminate\Contracts\Queue\Factory'<span class="p">);
<span class="line">        <span class="p">});
<span class="line">    <span class="p">});
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

上面方法体将一个 Illuminate\Events\Dispatcher 对象以键 events 绑定到了容器 中,它负责实现事件的调度。

再看看 Illuminate\Routing\RoutingServiceProvider:

Illuminate\Routing\RoutingServiceProvider#register

<span class="line-number">1
<span class="line-number">2
<span class="line-number">3
<span class="line-number">4
<span class="line-number">5
<span class="line-number">6
<span class="line-number">7
<span class="line-number">8
<span class="line-number">9
<span class="line-number">10
<span class="line-number">11
<span class="line-number">12
<span class="line-number">13
<span class="line-number">14
</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Copy after login
<code class="php"><span class="line"><span class="k">public <span class="k">function <span class="nf">register<span class="p">()
<span class="line"><span class="p">{
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerRouter<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerUrlGenerator<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerRedirector<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerPsrRequest<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerPsrResponse<span class="p">();
<span class="line">
<span class="line">    <span class="nv">$this<span class="o">-><span class="na">registerResponseFactory<span class="p">();
<span class="line"><span class="p">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
Copy after login

首页是在Laravel中接触的最多的 route 被注册,它是 Illuminate\Routing\Router 对象。

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

其他好文

http://www.cnblogs.com/wish123/p/4756669.html

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1666
14
PHP Tutorial
1273
29
C# Tutorial
1254
24
What does http status code 520 mean? What does http status code 520 mean? Oct 13, 2023 pm 03:11 PM

HTTP status code 520 means that the server encountered an unknown error while processing the request and cannot provide more specific information. Used to indicate that an unknown error occurred when the server was processing the request, which may be caused by server configuration problems, network problems, or other unknown reasons. This is usually caused by server configuration issues, network issues, server overload, or coding errors. If you encounter a status code 520 error, it is best to contact the website administrator or technical support team for more information and assistance.

What is http status code 403? What is http status code 403? Oct 07, 2023 pm 02:04 PM

HTTP status code 403 means that the server rejected the client's request. The solution to http status code 403 is: 1. Check the authentication credentials. If the server requires authentication, ensure that the correct credentials are provided; 2. Check the IP address restrictions. If the server has restricted the IP address, ensure that the client's IP address is restricted. Whitelisted or not blacklisted; 3. Check the file permission settings. If the 403 status code is related to the permission settings of the file or directory, ensure that the client has sufficient permissions to access these files or directories, etc.

Understand common application scenarios of web page redirection and understand the HTTP 301 status code Understand common application scenarios of web page redirection and understand the HTTP 301 status code Feb 18, 2024 pm 08:41 PM

Understand the meaning of HTTP 301 status code: common application scenarios of web page redirection. With the rapid development of the Internet, people's requirements for web page interaction are becoming higher and higher. In the field of web design, web page redirection is a common and important technology, implemented through the HTTP 301 status code. This article will explore the meaning of HTTP 301 status code and common application scenarios in web page redirection. HTTP301 status code refers to permanent redirect (PermanentRedirect). When the server receives the client's

HTTP 200 OK: Understand the meaning and purpose of a successful response HTTP 200 OK: Understand the meaning and purpose of a successful response Dec 26, 2023 am 10:25 AM

HTTP Status Code 200: Explore the Meaning and Purpose of Successful Responses HTTP status codes are numeric codes used to indicate the status of a server's response. Among them, status code 200 indicates that the request has been successfully processed by the server. This article will explore the specific meaning and use of HTTP status code 200. First, let us understand the classification of HTTP status codes. Status codes are divided into five categories, namely 1xx, 2xx, 3xx, 4xx and 5xx. Among them, 2xx indicates a successful response. And 200 is the most common status code in 2xx

How to use Nginx Proxy Manager to implement automatic jump from HTTP to HTTPS How to use Nginx Proxy Manager to implement automatic jump from HTTP to HTTPS Sep 26, 2023 am 11:19 AM

How to use NginxProxyManager to implement automatic jump from HTTP to HTTPS. With the development of the Internet, more and more websites are beginning to use the HTTPS protocol to encrypt data transmission to improve data security and user privacy protection. Since the HTTPS protocol requires the support of an SSL certificate, certain technical support is required when deploying the HTTPS protocol. Nginx is a powerful and commonly used HTTP server and reverse proxy server, and NginxProxy

Quick Application: Practical Development Case Analysis of PHP Asynchronous HTTP Download of Multiple Files Quick Application: Practical Development Case Analysis of PHP Asynchronous HTTP Download of Multiple Files Sep 12, 2023 pm 01:15 PM

Quick Application: Practical Development Case Analysis of PHP Asynchronous HTTP Download of Multiple Files With the development of the Internet, the file download function has become one of the basic needs of many websites and applications. For scenarios where multiple files need to be downloaded at the same time, the traditional synchronous download method is often inefficient and time-consuming. For this reason, using PHP to download multiple files asynchronously over HTTP has become an increasingly common solution. This article will analyze in detail how to use PHP asynchronous HTTP through an actual development case.

http request 415 error solution http request 415 error solution Nov 14, 2023 am 10:49 AM

Solution: 1. Check the Content-Type in the request header; 2. Check the data format in the request body; 3. Use the appropriate encoding format; 4. Use the appropriate request method; 5. Check the server-side support.

How to display the source code of PHP code in the browser without being interpreted and executed? How to display the source code of PHP code in the browser without being interpreted and executed? Mar 11, 2024 am 10:54 AM

How to display the source code of PHP code in the browser without being interpreted and executed? PHP is a server-side scripting language commonly used to develop dynamic web pages. When a PHP file is requested on the server, the server interprets and executes the PHP code in it and sends the final HTML content to the browser for display. However, sometimes we want to display the source code of the PHP file directly in the browser instead of being executed. This article will introduce how to display the source code of PHP code in the browser without being interpreted and executed. In PHP, you can use

See all articles