Подтвердить что ты не робот

Laravel 4 - когда использовать поставщиков услуг?

Я попробовал Google, но не нашел подробной информации.

Поставщики услуг - отличный способ группировать связанные записи IoC в одном месте. Подумайте о них как о способе загрузки компонентов в вашем приложении.

Непонимание из документации. Нужно ли это только при создании пакетов? Поэтому, когда я являюсь постоянным разработчиком и не создаю некоторые пакеты для публикации на публике - мне не нужно заботиться?

4b9b3361

Ответ 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: Как решены Фасады?, это может помочь вам понять.

Ответ 2

Нет ничего, что мог бы сделать поставщик услуг, который вы не можете просто использовать в app/start/global.php, но с поставщиком услуг вы собираете всю логику в одном месте и можете разрабатывать приложение более модульным способом.

Если вы делаете пакет, поставщик услуг в значительной степени обязан.

Ответ 3

В Laravel поставщики услуг напрямую связаны с тем, как работает контейнер IoC. Они обеспечивают более простой и более модульный подход к зависимостям. Фактически, это отличный образец для организации вашего кода в стиле бутстрапа (даже за пределами Laravel). Я думаю, что если вы являетесь постоянным разработчиком, вам все равно нужно знать основы поставщиков услуг Laravel, потому что эта модель является неотъемлемой частью архитектуры Laravel. Я уверен, что это может облегчить вашу работу. Например, при установке пакета вам необходимо предоставить доступ к этому пакету приложений - одно из лучших решений - это список поставщиков услуг и фасад. С другой стороны, я не могу представить себя разработчиком Laravel, не зная оснований SP-s.