laravel5源码讲解整理,laravel5源码讲解
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> 登入後複製 |
<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> 登入後複製 |
第二十一行代码
<span class="line-number">1 </span> 登入後複製 登入後複製 |
<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> 登入後複製 |
为Laravel应用引入了由Composer
提供的类加载器,这样Laravel应用便无需再手动加载任 何的类。其加载原理不是此次探究的目标,所以仅仅这样使用就好了。接下的代码,便是重 点。
Illuminate\Foundation\Application 类
该类的继承结构如下:
第三十五行代码
<span class="line-number">1 </span> 登入後複製 登入後複製 |
<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> 登入後複製 |
它将我的视线引入到了另外一个文件中,去看看到底发生了什么吧。
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> 登入後複製 |
<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> 登入後複製 |
看第十四行,原来$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> 登入後複製 |
<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> 登入後複製 |
顺着函数调用,往下看。在这个构造函数中,首先调用了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> 登入後複製 |
<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> 登入後複製 |
这段代码,是将实例对象注入到容器中。那么,这个容器是什么呢?答案还是要从这段调用 中去寻找。
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> 登入後複製 |
<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> 登入後複製 |
视线重新回到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> 登入後複製 |
<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> 登入後複製 |
其中,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> 登入後複製 |
<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> 登入後複製 |
上面方法体将一个 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> 登入後複製 |
<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> 登入後複製 |
首页是在Laravel中接触的最多的 route
被注册,它是 Illuminate\Routing\Router
对象。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
其他好文
http://www.cnblogs.com/wish123/p/4756669.html
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

http狀態碼520是指伺服器在處理請求時遇到了一個未知的錯誤,無法提供更具體的資訊。用於表示伺服器在處理請求時發生了一個未知的錯誤,可能是由於伺服器配置問題、網路問題或其他未知原因導致的。通常是由伺服器配置問題、網路問題、伺服器過載或程式碼錯誤等原因導致的。如果遇到狀態碼520錯誤,最好聯絡網站管理員或技術支援團隊以取得更多的資訊和協助。

http狀態碼403是伺服器拒絕了客戶端的請求的意思。解決http狀態碼403的方法是:1、檢查身份驗證憑證,如果伺服器要求身份驗證,確保提供正確的憑證;2、檢查IP位址限制,如果伺服器對IP位址進行了限制,確保客戶端的IP位址被列入白名單或未列入黑名單;3、檢查文件權限設置,如果403狀態碼與文件或目錄的權限設置有關,確保客戶端具有足夠的權限訪問這些文件或目錄等等。

掌握HTTP301狀態碼的意思:網頁重定向的常見應用場景隨著網路的快速發展,人們對網頁互動的要求也越來越高。在網頁設計領域,網頁重定向是一種常見且重要的技術,透過HTTP301狀態碼來實現。本文將探討HTTP301狀態碼的意義以及在網頁重新導向中的常見應用場景。 HTTP301狀態碼是指永久重新導向(PermanentRedirect)。當伺服器接收到客戶端發

HTTP狀態碼200:探索成功回應的意義與用途HTTP狀態碼是用來表示伺服器回應狀態的數字代碼。其中,狀態碼200表示請求已成功被伺服器處理。本文將探討HTTP狀態碼200的具體意義與用途。首先,讓我們來了解HTTP狀態碼的分類。狀態碼分為五個類別,分別是1xx、2xx、3xx、4xx和5xx。其中,2xx表示成功的回應。而200是2xx中最常見的狀態碼

如何使用NginxProxyManager實現HTTP到HTTPS的自動跳轉隨著互聯網的發展,越來越多的網站開始採用HTTPS協議來加密傳輸數據,以提高數據的安全性和用戶的隱私保護。由於HTTPS協定需要SSL憑證的支持,因此在部署HTTPS協定時需要有一定的技術支援。 Nginx是一款強大且常用的HTTP伺服器和反向代理伺服器,而NginxProxy

快速應用:PHP非同步HTTP下載多個檔案的實用開發案例分析隨著互聯網的發展,檔案下載功能已成為許多網站和應用程式的基本需求之一。而對於需要同時下載多個檔案的場景,傳統的同步下載方式往往效率低且耗費時間。為此,使用PHP非同步HTTP下載多個檔案成為了越來越常見的解決方案。本文將透過一個實際的開發案例,詳細分析如何使用PHP非同步HTTP

解決方法:1、檢查請求頭中的Content-Type;2、檢查請求體中的資料格式;3、使用適當的編碼格式;4、使用適當的請求方法;5、檢查伺服器端的支援。

PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? PHP是一種伺服器端腳本語言,通常用於開發動態網頁。當PHP檔案在伺服器上被要求時,伺服器會解釋執行其中的PHP程式碼,並將最終的HTML內容傳送到瀏覽器以供顯示。然而,有時我們希望在瀏覽器中直接展示PHP檔案的原始碼,而不是被執行。本文將介紹如何在瀏覽器中顯示PHP程式碼的源碼,而不被解釋執行。在PHP中,可以使
