Ответ 1
Один из ключей к созданию хорошо зарекомендовавшего себя приложения Laravel научиться использовать сервис-провайдеров в качестве организационного инструмента. Когда вы регистрируя многие классы с контейнером IoC, все эти привязки может начать загромождать файлы приложения/запуска. Вместо того, чтобы делать контейнер регистрация в этих файлах, создание сервис-провайдеров, которые регистрируют связанных с обслуживанием.
Итак, это способ организовать ваши приложения в одном месте, чтобы он был более организованным. Поставщик услуг должен иметь хотя бы один метод: register. Метод 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), поскольку службы регистрируются методом register
каждого поставщика услуг, но в рамках метода boot
вы можете использовать любую услугу, потому что к тому времени все службы, как мы надеемся, будут зарегистрированы.
Отметьте этот ответ Laravel 4: Как решены Фасады?, это может помочь вам понять.