基于服务容器的扩展
几乎每个 Laravel 框架引入的服务提供者都会绑定对象到服务容器中。你可以在 config/app.php 配置文件中找到应用程序的服务提供者清单。如果你有时间,你应该浏览过这里面每一个提供者的源代码。通过这样做,你将会更了解每一个提供者添加什么到框架,以及用什么键值来绑定各种服务到服务容器。
例如, HashServiceProvider 绑定 hash 做为键值到服务容器,它将解析成 Illuminate\Hashing\BcryptHasher 实例。你可以在应用程序中覆写这个 IoC 绑定,轻松地扩展并覆写这个类。例如:
<?php namespace App\Providers;
class SnappyHashProvider extends \Illuminate\Hashing\HashServiceProvider {
public function boot()
{
parent::boot();
$this->app->bindShared('hash', function()
{
return new \Snappy\Hashing\ScryptHasher;
});
}
}
要注意的是这个类扩展 HashServiceProvider,不是默认的 ServiceProvider 基础类。当你扩展了服务提供者,在 config/app.php 配置文件把 HashServiceProvider 换成你扩展的提供者名称。
这是被绑定在容器的所有核心类的一般扩展方法。实际上,每个以这种方式绑定在容器的核心类都可以被覆写。再次强调,看过每个框架引入的服务提供者将会使你熟悉:每个类被绑在容器的哪里、它们是用什么键值绑定。这是个好方法可以了解更多关于 Laravel 如何结合它们。