Dar*_*s.V 37 service-provider laravel laravel-4
我试图谷歌但没有找到详细信息.
服务提供商是在单个位置对相关IoC注册进行分组的好方法.将它们视为在应用程序中引导组件的一种方法.
不从文档中理解.这只是在我创建包时才需要的吗?因此,当我是常规开发人员而不是公开发布一些软件包时 - 我不需要关心?
The*_*pha 69
构建设计良好的Laravel应用程序的关键之一是学习使用服务提供程序作为组织工具.当您使用IoC容器注册许多类时,所有这些绑定都可能开始混乱您的app/start文件.不要在这些文件中进行容器注册,而是创建注册相关服务的服务提供者.
因此,这是一种在一个地方组织应用程序服务以使其更有条理的方法.服务提供者必须至少有一个方法:注册.register方法是提供程序将类绑定到容器的位置.当请求进入您的应用程序并且框架正在启动时,将在配置文件中列出的提供程序上调用register方法
'providers' => array(
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
// more ...
'Illuminate\Html\HtmlServiceProvider',
// more ...
)
Run Code Online (Sandbox Code Playgroud)
这是app.php配置文件中的providers数组,这是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']);
});
}
}
Run Code Online (Sandbox Code Playgroud)
当Laravel启动时,它调用this(register)方法并且在这个方法中有两行,这些行调用两个方法,registerHtmlBuilder()并且registerFormBuilder(),这两个方法组件都IoC使用了容器
$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,两者都是匿名函数,它们返回html/form类的实例,这就是您使用时的原因
Html::link(...);
Run Code Online (Sandbox Code Playgroud)
或者,使用表格
Form::input(...);
Run Code Online (Sandbox Code Playgroud)
您从$app应用程序可用的对象获取绑定类.在这种情况下'Html' => 'Illuminate\Support\Facades\Html',,用于对文件中aliases数组中的主类进行别名app.php.
因此,Laravel服务提供商是一种以更清洁的方式组织事物的方法,在应用程序的启动过程中,Laravel运行register来自所有服务提供者的所有方法,以便每个组件都可用(绑定)到IoC容器,以便您可以访问他们在你的申请中.
值得一提的是,在register从服务提供商调用所有方法之后,调用boot来自这些服务提供者的所有方法.在这种情况下,如果您需要使用服务提供程序类中的应用程序(IoC/Service Container)中的任何服务,那么您应该使用引导方法中的该服务,因为在服务提供程序注册期间不保证任何服务都可用. (在注册方法内)因为服务是通过register每个服务提供商的boot方法注册的,但是在方法中你可以使用任何服务,因为那时每个服务都有希望注册.
检查这个答案Laravel 4:Facades是如何解决的?它也可以帮助你理解.
服务提供商无法做到这一点,你不能只是打入app/start/global.php,但是通过服务提供商,你可以在一个地方收集所有逻辑,并且可以以更模块化的方式开发应用程序.
如果你正在制作一个包,那么服务提供商几乎是必须的.
| 归档时间: |
|
| 查看次数: |
24772 次 |
| 最近记录: |