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

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。