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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











HTTP ステータス コード 520 は、サーバーがリクエストの処理中に不明なエラーに遭遇し、より具体的な情報を提供できないことを意味します。サーバーがリクエストを処理しているときに不明なエラーが発生したことを示すために使用されます。サーバー構成の問題、ネットワークの問題、またはその他の不明な理由が原因である可能性があります。これは通常、サーバー構成の問題、ネットワークの問題、サーバーの過負荷、またはコーディング エラーが原因で発生します。ステータス コード 520 エラーが発生した場合は、Web サイト管理者またはテクニカル サポート チームに連絡して詳細情報と支援を得ることが最善です。

NginxProxyManager を使用して HTTP から HTTPS への自動ジャンプを実装する方法 インターネットの発展に伴い、ますます多くの Web サイトが HTTPS プロトコルを使用してデータ送信を暗号化し、データ セキュリティとユーザーのプライバシー保護を向上させ始めています。 HTTPS プロトコルは SSL 証明書のサポートを必要とするため、HTTPS プロトコルを展開する際には特定の技術サポートが必要です。 Nginx は強力で一般的に使用される HTTP サーバーおよびリバース プロキシ サーバーであり、NginxProxy

HTTP 301 ステータス コードの意味を理解する: Web ページ リダイレクトの一般的なアプリケーション シナリオ インターネットの急速な発展に伴い、Web ページの操作に対する人々の要求はますます高くなっています。 Web デザインの分野では、Web ページのリダイレクトは一般的かつ重要なテクノロジであり、HTTP 301 ステータス コードによって実装されます。この記事では、HTTP 301 ステータス コードの意味と、Web ページ リダイレクトにおける一般的なアプリケーション シナリオについて説明します。 HTTP301 ステータス コードは、永続的なリダイレクト (PermanentRedirect) を指します。サーバーがクライアントのメッセージを受信すると、

HTTP ステータス コード 403 は、サーバーがクライアントの要求を拒否したことを意味します。 http ステータス コード 403 の解決策は次のとおりです: 1. 認証資格情報を確認します。サーバーが認証を必要とする場合は、正しい資格情報が提供されていることを確認します。2. IP アドレス制限を確認します。サーバーが IP アドレスを制限している場合は、クライアントの IP アドレスは制限されています。ホワイトリストに登録されているか、ブラックリストに登録されていません。3. ファイルのアクセス許可設定を確認します。403 ステータス コードがファイルまたはディレクトリのアクセス許可設定に関連している場合は、クライアントがこれらのファイルまたはディレクトリにアクセスするための十分なアクセス許可を持っていることを確認してください。等

解決策: 1. リクエスト ヘッダーの Content-Type を確認する; 2. リクエスト本文のデータ形式を確認する; 3. 適切なエンコード形式を使用する; 4. 適切なリクエスト メソッドを使用する; 5. サーバー側のサポートを確認する。

クイック アプリケーション: PHP の実践的な開発ケース分析 複数ファイルの非同期 HTTP ダウンロード インターネットの発展に伴い、ファイル ダウンロード機能は多くの Web サイトやアプリケーションの基本的なニーズの 1 つになりました。複数のファイルを同時にダウンロードする必要があるシナリオでは、従来の同期ダウンロード方法は非効率的で時間がかかることがよくあります。このため、PHP を使用して HTTP 経由で複数のファイルを非同期にダウンロードするソリューションがますます一般的になってきています。この記事では、実際の開発事例を通して、PHP 非同期 HTTP の使用方法を詳しく分析します。

C# におけるネットワーク通信とセキュリティの一般的な問題と解決策 今日のインターネット時代では、ネットワーク通信はソフトウェア開発に不可欠な部分となっています。 C# では通常、データ送信のセキュリティ、ネットワーク接続の安定性など、ネットワーク通信の問題が発生します。この記事では、C# における一般的なネットワーク通信とセキュリティの問題について詳しく説明し、対応する解決策とコード例を提供します。 1. ネットワーク通信の問題 ネットワーク接続の中断: ネットワーク通信プロセス中に、ネットワーク接続が中断される場合があります。

C++ で HTTP ストリーミングを実装するにはどうすればよいですか? Boost.Asio と asiohttps クライアント ライブラリを使用して、SSL ストリーム ソケットを作成します。サーバーに接続し、HTTP リクエストを送信します。 HTTP 応答ヘッダーを受信して出力します。 HTTP 応答本文を受信して出力します。
