Jadual Kandungan
来源: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
Rumah pembangunan bahagian belakang tutorial php laravel5源码讲授整理

laravel5源码讲授整理

Jun 13, 2016 pm 12:27 PM
application gt the this

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>
Salin selepas log masuk
<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 <[email&#160;protected]><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>
Salin selepas log masuk

第二十一行代码

<span class="line-number">1</span>
Salin selepas log masuk
Salin selepas log masuk
<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>
Salin selepas log masuk

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

Illuminate\Foundation\Application 类

该类的继承结构如下:

类继承结构

第三十五行代码

<span class="line-number">1</span>
Salin selepas log masuk
Salin selepas log masuk
<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>
Salin selepas log masuk

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

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>
Salin selepas log masuk
<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>
Salin selepas log masuk

看第十四行,原来$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>
Salin selepas log masuk
<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>
Salin selepas log masuk

顺着函数调用,往下看。在这个构造函数中,首先调用了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>
Salin selepas log masuk
<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>
Salin selepas log masuk

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

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>
Salin selepas log masuk
<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>
Salin selepas log masuk

视线重新回到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>
Salin selepas log masuk
<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>
Salin selepas log masuk

其中,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>
Salin selepas log masuk
<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>
Salin selepas log masuk

上面方法体将一个 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>
Salin selepas log masuk
<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>
Salin selepas log masuk

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

 

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

其他好文

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

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

 

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah perbezaan antara Huawei GT3 Pro dan GT4? Apakah perbezaan antara Huawei GT3 Pro dan GT4? Dec 29, 2023 pm 02:27 PM

Ramai pengguna akan memilih jenama Huawei apabila memilih jam tangan pintar Antaranya, Huawei GT3pro dan GT4 adalah pilihan yang sangat popular. Apakah perbezaan antara Huawei GT3pro dan GT4? 1. Rupa GT4: 46mm dan 41mm, bahan cermin kaca + badan keluli tahan karat + cangkang belakang gentian resolusi tinggi. GT3pro: 46.6mm dan 42.9mm, bahannya ialah kaca nilam + badan titanium/badan seramik + cangkerang belakang seramik 2. GT4 yang sihat: Menggunakan algoritma Huawei Truseen5.5+ terkini, hasilnya akan lebih tepat. GT3pro: Penambahan elektrokardiogram ECG dan saluran darah serta keselamatan

2 bulan kemudian, robot humanoid Walker S boleh melipat pakaian 2 bulan kemudian, robot humanoid Walker S boleh melipat pakaian Apr 03, 2024 am 08:01 AM

Editor Laporan Kuasa Mesin: Wu Xin Versi domestik robot humanoid + pasukan model besar menyelesaikan tugas operasi bahan fleksibel yang kompleks seperti melipat pakaian buat kali pertama. Dengan pelancaran Figure01, yang mengintegrasikan model besar berbilang modal OpenAI, kemajuan berkaitan rakan domestik telah menarik perhatian. Baru semalam, UBTECH, "stok robot humanoid nombor satu" China, mengeluarkan demo pertama robot humanoid WalkerS yang disepadukan secara mendalam dengan model besar Baidu Wenxin, menunjukkan beberapa ciri baharu yang menarik. Kini, WalkerS, diberkati oleh keupayaan model besar Baidu Wenxin, kelihatan seperti ini. Seperti Rajah01, WalkerS tidak bergerak, tetapi berdiri di belakang meja untuk menyelesaikan satu siri tugasan. Ia boleh mengikut perintah manusia dan melipat pakaian

Betulkan: Alat snipping tidak berfungsi dalam Windows 11 Betulkan: Alat snipping tidak berfungsi dalam Windows 11 Aug 24, 2023 am 09:48 AM

Mengapa Alat Snipping Tidak Berfungsi pada Windows 11 Memahami punca masalah boleh membantu mencari penyelesaian yang betul. Berikut ialah sebab utama Alat Snipping mungkin tidak berfungsi dengan betul: Focus Assistant dihidupkan: Ini menghalang Snipping Tool daripada dibuka. Aplikasi rosak: Jika alat snipping ranap semasa pelancaran, ia mungkin rosak. Pemacu grafik lapuk: Pemacu yang tidak serasi mungkin mengganggu alat snipping. Gangguan daripada aplikasi lain: Aplikasi lain yang sedang berjalan mungkin bercanggah dengan Alat Snipping. Sijil telah tamat tempoh: Ralat semasa proses naik taraf boleh menyebabkan penyelesaian mudah ini sesuai untuk kebanyakan pengguna dan tidak memerlukan sebarang pengetahuan teknikal khusus. 1. Kemas kini apl Windows dan Microsoft Store

Apakah prinsip Aplikasi WSGI python? Apakah prinsip Aplikasi WSGI python? May 19, 2023 pm 01:25 PM

Persekitaran ular sawa yang bergantung pada artikel ini ialah: Apakah WSGI itu juga dipanggil antara muka gerbang universal pelayan web, dan nama penuhnya ialah antara muka webservergateway? Ia mentakrifkan piawaian untuk cara pelayan web dan aplikasi web harus berkomunikasi dan mengendalikan permintaan dan respons http dalam Python Perhatikan bahawa ia hanyalah protokol, atau spesifikasi atau piawaian ini pelayan yang kami tulis dalam artikel sebelum ini. WSGI juga dibahagikan kepada aplikasi dan gateway pelayan Antaranya, Flask yang terkenal adalah milik aplikasi, dan uWSGI dan wsgiref tergolong dalam gateway pelayan. Perasaan peribadi, WSG

Cara Membetulkan Ralat Tidak Dapat Menyambung ke App Store pada iPhone Cara Membetulkan Ralat Tidak Dapat Menyambung ke App Store pada iPhone Jul 29, 2023 am 08:22 AM

Bahagian 1: Langkah Penyelesaian Masalah Awal Menyemak Status Sistem Apple: Sebelum menyelidiki penyelesaian yang rumit, mari kita mulakan dengan asas. Masalahnya mungkin tidak terletak pada peranti anda; Lawati halaman Status Sistem Apple untuk melihat sama ada AppStore berfungsi dengan betul. Jika terdapat masalah, anda hanya boleh menunggu Apple membetulkannya. Semak sambungan Internet anda: Pastikan anda mempunyai sambungan internet yang stabil kerana isu "Tidak dapat menyambung ke AppStore" kadangkala boleh dikaitkan dengan sambungan yang lemah. Cuba tukar antara Wi-Fi dan data mudah alih atau tetapkan semula tetapan rangkaian (Umum > Tetapkan Semula > Tetapkan Semula Tetapan Rangkaian > Tetapan). Kemas kini versi iOS anda:

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Artikel untuk memahami panduan ini dan mengejar 70% orang hadapan Artikel untuk memahami panduan ini dan mengejar 70% orang hadapan Sep 06, 2022 pm 05:03 PM

Seorang rakan sekerja tersekat kerana pepijat yang ditunjukkan oleh masalah penunjuk Vue2 ini menyebabkan fungsi anak panah digunakan, mengakibatkan ketidakupayaan untuk mendapatkan prop yang sepadan. Dia tidak tahu apabila saya memperkenalkannya kepadanya, dan kemudian saya sengaja melihat kumpulan pertukaran bahagian hadapan Setakat ini, sekurang-kurangnya 70% pengaturcara bahagian hadapan masih tidak memahaminya anda pautan ini. Jika semuanya tidak jelas saya belum belajar bagaimana untuk melakukannya, sila berikan saya mulut yang besar.

Adakah watch4pro lebih baik atau gt? Adakah watch4pro lebih baik atau gt? Sep 26, 2023 pm 02:45 PM

Watch4pro dan gt masing-masing mempunyai ciri yang berbeza dan senario yang berkenaan Jika anda menumpukan pada fungsi yang komprehensif, prestasi tinggi dan penampilan yang bergaya, dan sanggup menanggung harga yang lebih tinggi, maka Watch 4 Pro mungkin lebih sesuai. Jika anda tidak mempunyai keperluan fungsi yang tinggi dan memberi lebih perhatian kepada hayat bateri dan harga yang berpatutan, maka siri GT mungkin lebih sesuai. Pilihan terakhir harus diputuskan berdasarkan keperluan peribadi, belanjawan dan keutamaan Adalah disyorkan untuk mempertimbangkan dengan teliti keperluan anda sendiri sebelum membeli dan merujuk kepada ulasan dan perbandingan pelbagai produk untuk membuat pilihan yang lebih termaklum.

See all articles