One of the keys to building a well architected Laravel application is
learning to use serviceproviders as an organizational tool. When you are
registering many classes with the IoC container, all of those bindings
can start to clutter your app/start files. Instead of doing container
registrations in those files, create serviceproviders that register
related services.
So, this is a way to organize your application's services in one place to keep it more organized. A service provider must have at least one method: register. The register method is where the provider binds classes to the container. When a request enters your application and the framework is booting up, the register method is called on the providers listed in your configuration file
'providers' => array(
'IlluminateFoundationProvidersArtisanServiceProvider',
'IlluminateAuthAuthServiceProvider',
'IlluminateCacheCacheServiceProvider',
// more ...
'IlluminateHtmlHtmlServiceProvider',
// more ...
)
This is providers array in app.php
config file and this is the HtmlServiceProvider
stored in 'IlluminateHtmlHtmlServiceProvider.php'
use IlluminateSupportServiceProvider;
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']);
});
}
}
When, Laravel
boots up, it calls this (register
) method and in this method there are two lines, these line calls two methods, registerHtmlBuilder()
and registerFormBuilder()
, these both methods components to the IoC
container using
$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);
In this case both are anonymous functions which returns an instance of html/form
class and that's why, when you use
Html::link(...);
Or, using form
Form::input(...);
You get the bound class from the $app
object which is available to your application. In this case 'Html' => 'IlluminateSupportFacadesHtml',
is used to alias the main class in the aliases
array in the app.php
file.
So, in Laravel
, service providers are a way to organize things in a nice cleaner way, during the boot up process of your application, Laravel
runs all register
methods from all the service providers so each component become available (bound) to the IoC
container so you can access them in your application.
It's worth mentioning that, after calling of all register
methods from service providers all the boot
methods from those service providers get called. In that case, if you need to use any service from the application (IoC/Service Container) within the service provider class then you should use that service from the boot method since it's not guranteed that any service is avaiable during the registeration of service providers (within register method) because services are registered through register
method of each service provider but within the boot
method you may use any service because by then every service is hopefully registered.
Check this answer Laravel 4 : How are Facades resolved? too, it may help you to understand.