构建良好架构的 Laravel 应用程序的关键之一是
学习使用服务提供商作为组织工具。当你在
向 IoC 容器注册许多类,所有这些绑定
可能会开始使您的应用程序/启动文件变得混乱。而不是做容器
在这些文件中注册,创建注册的服务提供者
相关服务。
因此,这是一种将应用程序的服务组织在一个地方以使其更有条理的方法。服务提供者必须至少有一种方法:注册。 register 方法是提供者将类绑定到容器的地方。当请求进入您的应用程序并且框架正在启动时,会在您的配置文件中列出的提供程序上调用 register 方法
'providers' => array(
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
// more ...
'Illuminate\Html\HtmlServiceProvider',
// more ...
)
这是 app.php 配置文件中的 providers 数组,这是存储在 'Illuminate\Html\HtmlServiceProvider.php' 中的 HtmlServiceProvider
use Illuminate\Support\ServiceProvider;
class HtmlServiceProvider extends ServiceProvider {
//...
public function register()
{
$this->registerHtmlBuilder();
$this->registerFormBuilder();
}
protected function registerHtmlBuilder()
{
$this->app['html'] = $this->app->share(function($app)
{
return new HtmlBuilder($app['url']);
});
}
protected function registerFormBuilder()
{
$this->app['form'] = $this->app->share(function($app)
{
$form = new FormBuilder($app['html'], $app['url'], $app['session']->getToken());
return $form->setSessionStore($app['session']);
});
}
}
Laravel 启动时,它调用这个 (register) 方法,在这个方法中有两行,这行调用两个方法,registerHtmlBuilder() 和 registerFormBuilder(),这两个方法都包含在 @ 987654331@容器使用
$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);
在这种情况下,两者都是匿名函数,它们返回 html/form 类的实例,这就是为什么,当你使用时
Html::link(...);
或者,使用表单
Form::input(...);
您从可用于您的应用程序的$app 对象中获取绑定类。在这种情况下,'Html' => 'Illuminate\Support\Facades\Html', 用于给 app.php 文件中的 aliases 数组中的主类起别名。
因此,在Laravel 中,服务提供者是一种以更简洁的方式组织事物的方式,在应用程序的启动过程中,Laravel 运行来自所有服务提供者的所有 register 方法,因此每个组件对IoC 容器可用(绑定),以便您可以在应用程序中访问它们。
值得一提的是,在调用服务提供者的所有register 方法后,这些服务提供者的所有boot 方法都会被调用。在这种情况下,如果您需要在服务提供者类中使用应用程序(IoC/服务容器)中的任何服务,那么您应该从引导方法中使用该服务,因为在注册服务提供者期间不能保证任何服务都可用(在 register 方法内)因为服务是通过每个服务提供者的 register 方法注册的,但在 boot 方法内您可以使用任何服务,因为到那时每个服务都希望注册。
也检查这个答案Laravel 4 : How are Facades resolved?,它可能会帮助你理解。