我试图谷歌但没有找到详细信息。
服务提供商是分组相关IoC注册的好方法 在一个地方。将它们视为引导组件的一种方式 在你的申请中。
不从文档中理解。这只是在我创建包时才需要的吗?所以,当我是普通的开发人员而不是公开发布一些软件包时 - 我不需要关心吗?
答案 0 :(得分:65)
构建设计良好的Laravel应用程序的关键之一是 学习使用serviceproviders作为组织工具。当你是 使用IoC容器注册许多类,所有这些绑定 可以开始混乱你的app / start文件。而不是做容器 在这些文件中注册,创建注册的服务提供者 相关服务。
因此,这是一种在一个地方整理应用程序服务以使其更有条理的方法。服务提供者必须至少有一个方法:注册。 register方法是提供程序将类绑定到容器的位置。当请求进入您的应用程序并且框架正在启动时,将在配置文件中列出的提供程序上调用register方法
'providers' => array(
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
// more ...
'Illuminate\Html\HtmlServiceProvider',
// more ...
)
这是app.php
配置文件中的提供者数组,这是HtmlServiceProvider
中存储的'Illuminate\Html\HtmlServiceProvider.php'
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()
,这两个方法组件使用
IoC
容器
$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);
在这种情况下,两者都是匿名函数,它返回html/form
类的实例,这就是为什么,当你使用
Html::link(...);
或者,使用表格
Form::input(...);
您从应用程序可用的$app
对象获取绑定类。在这种情况下,'Html' => 'Illuminate\Support\Facades\Html',
用于对aliases
文件中app.php
数组中的主类进行别名。
因此,在Laravel
中,服务提供程序是一种以更清晰的方式组织事物的方法,在应用程序的启动过程中,Laravel
运行所有register
方法服务提供商使每个组件都可以(绑定)到IoC
容器,以便您可以在应用程序中访问它们。
值得一提的是,在从服务提供商调用所有register
方法之后,将调用来自这些服务提供商的所有boot
方法。在这种情况下,如果您需要使用服务提供程序类中的应用程序(IoC / Service Container)中的任何服务,那么您应该使用引导方法中的该服务,因为在服务提供程序注册期间不保证任何服务都可用。 (在注册方法中)因为服务是通过每个服务提供商的register
方法注册的,但在boot
方法中你可以使用任何服务,因为那时每个服务都有希望注册。
也可以查看此答案Laravel 4 : How are Facades resolved?,这可能有助于您理解。
答案 1 :(得分:7)
服务提供商没有什么可以做到的,你不能只是打入app / start / global.php,但是通过服务提供商,你可以在一个地方收集所有逻辑,并且可以以更模块化的方式开发应用程序。 / p>
如果您正在制作包裹,那么服务提供商几乎是必须的。
答案 2 :(得分:1)
在Laravel中,服务提供商与IoC容器的工作方式直接相关。它们允许更容易和更模块化的依赖方法。实际上,它是以引导方式(甚至在Laravel之外)组织代码的一种很好的模式。我认为如果您是常规开发人员,您仍需要了解Laravel服务提供商的基础知识,因为该模式是Laravel架构不可或缺的一部分。我相信它可以让你的工作更轻松。
例如,在安装软件包时,您必须为该软件包提供应用程序访问权限 - 最佳解决方案之一是通过服务提供商列表和外观。另一方面,如果不了解SP-s的基础知识,我无法想象成为Laravel开发人员。