我试图用谷歌搜索,但没有找到详细信息。
服务提供商是将相关的 IoC 注册分组到一个位置的好方法。将它们视为在应用程序中引导组件的一种方式。
从文档中无法理解。这仅在我创建包时需要吗?因此,当我是普通开发人员并且不制作一些要公开发布的软件包时 - 我不需要关心?
我试图用谷歌搜索,但没有找到详细信息。
服务提供商是将相关的 IoC 注册分组到一个位置的好方法。将它们视为在应用程序中引导组件的一种方式。
从文档中无法理解。这仅在我创建包时需要吗?因此,当我是普通开发人员并且不制作一些要公开发布的软件包时 - 我不需要关心?
构建良好架构的 Laravel 应用程序的关键之一是学习使用服务提供者作为组织工具。当您向 IoC 容器注册许多类时,所有这些绑定都可能开始使您的应用程序/启动文件变得混乱。与其在这些文件中进行容器注册,不如创建注册相关服务的服务提供者。
因此,这是一种在一个地方组织应用程序服务以使其更有条理的方法。服务提供者必须至少有一种方法:注册。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
启动时,它调用 this ( )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/服务容器)中的任何服务,那么您应该从引导方法中使用该服务,因为在注册服务提供者期间不能保证任何服务都可用(在注册方法内)因为服务是通过register
每个服务提供者的方法注册的,但在该boot
方法内您可以使用任何服务,因为到那时每个服务都希望注册。
检查这个答案Laravel 4:Facades 是如何解决的?也可以帮助你理解。
服务提供者无能为力,您不能只使用 app/start/global.php,但是通过服务提供者,您可以将所有逻辑集中在一个地方,并且可以以更加模块化的方式开发应用程序。
如果您正在制作一个包,那么服务提供商几乎是必须的。
在 Laravel 中,服务提供者与 IoC 容器的工作方式直接相关。它们允许更简单、更模块化的依赖关系方法。事实上,它是一种以引导方式组织代码的好模式(即使在 Laravel 之外)。我认为如果你是普通的开发人员,你仍然需要了解 Laravel 服务提供者的基础知识,因为该模式是 Laravel 架构不可或缺的一部分。我相信它可以使您的工作更轻松。
例如,在安装包时,您必须授予应用程序对该包的访问权限——最好的解决方案之一是通过服务提供者列表和外观。另一方面,如果不了解 SP-s 的基础知识,我无法想象成为 Laravel 开发人员。