web-dev-qa-db-fra.com

Laravel 4 - quand utiliser les fournisseurs de services?

J'ai essayé de le rechercher sur Google, mais je n'ai pas trouvé d'informations détaillées.

Les fournisseurs de services sont un excellent moyen de regrouper les enregistrements IoC liés dans un seul emplacement. Considérez-les comme un moyen de bootstrap composants dans votre application.

Pas de compréhension de la documentation. Est-ce nécessaire uniquement lorsque je crée des packages? Donc, lorsque je suis un développeur régulier et que je ne fais pas de packages à publier en public - je n'ai pas besoin de m'en soucier?

36
Darius.V

L'une des clés de la construction d'une application Laravel bien conçue est d'apprendre à utiliser les fournisseurs de services comme outil d'organisation. Lorsque vous enregistrez de nombreuses classes avec le conteneur IoC, toutes ces liaisons peuvent commencer à encombrer votre Au lieu de faire des enregistrements de conteneurs dans ces fichiers, créez des fournisseurs de services qui enregistrent les services associés.

C'est donc un moyen d'organiser les services de votre application en un seul endroit pour la garder plus organisée. Un fournisseur de services doit avoir au moins une méthode: s'inscrire. La méthode de registre est l'endroit où le fournisseur lie les classes au conteneur. Lorsqu'une demande entre dans votre application et que le framework démarre, la méthode register est appelée sur les fournisseurs répertoriés dans votre fichier de configuration

'providers' => array(
    'Illuminate\Foundation\Providers\ArtisanServiceProvider',
    'Illuminate\Auth\AuthServiceProvider',
    'Illuminate\Cache\CacheServiceProvider',
    // more ...
    'Illuminate\Html\HtmlServiceProvider',
    // more ...
)

Il s'agit du tableau des fournisseurs dans le fichier de configuration app.php Et il s'agit du HtmlServiceProvider stocké dans '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']);
        });
    }

}

Lorsque Laravel démarre, il appelle cette méthode (register) et dans cette méthode, il y a deux lignes, cette ligne appelle deux méthodes, registerHtmlBuilder() et registerFormBuilder(), ces deux méthodes composants le conteneur IoC en utilisant

$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);

Dans ce cas, les deux sont des fonctions anonymes qui retournent une instance de la classe html/form Et c'est pourquoi, lorsque vous utilisez

Html::link(...);

Ou, en utilisant le formulaire

Form::input(...);

Vous obtenez la classe liée à partir de l'objet $app Qui est disponible pour votre application. Dans ce cas, 'Html' => 'Illuminate\Support\Facades\Html', Est utilisé pour alias la classe principale dans le tableau aliases du fichier app.php.

Donc, dans Laravel, les fournisseurs de services sont un moyen d'organiser les choses d'une manière plus propre et agréable, pendant le processus de démarrage de votre application, Laravel exécute toutes les méthodes register de toutes les fournisseurs de services afin que chaque composant soit disponible (lié) au conteneur IoC afin que vous puissiez y accéder dans votre application.

Il convient de mentionner que, après avoir appelé toutes les méthodes register de fournisseurs de services, toutes les méthodes boot de ces fournisseurs de services sont appelées. Dans ce cas, si vous devez utiliser un service de l'application (IoC/Service Container) au sein de la classe du fournisseur de services, vous devez utiliser ce service à partir de la méthode de démarrage, car il n'est pas garanti qu'un service soit disponible lors de l'inscription des fournisseurs de services. (dans la méthode de registre) car les services sont enregistrés via la méthode register de chaque fournisseur de services, mais dans la méthode boot, vous pouvez utiliser n'importe quel service car d'ici là, chaque service est, espérons-le, enregistré.

Vérifiez cette réponse Laravel 4: Comment les façades sont-elles résolues? aussi, cela peut vous aider à comprendre.

67
The Alpha

Il n'y a rien qu'un fournisseur de services puisse faire que vous ne puissiez pas simplement insérer dans app/start/global.php, mais avec un fournisseur de services, vous rassemblez toute la logique en un seul endroit et pouvez développer une application de manière plus modulaire.

Si vous créez un package, un fournisseur de services est à peu près un must.

7
Andreas

À Laravel, les prestataires de services sont directement liés à la façon dont fonctionne le conteneur IoC. Ils permettent une approche plus facile et plus modulaire des dépendances. En fait, c'est un excellent modèle pour organiser votre code de manière bootstrap (même en dehors de Laravel). Je pense que si vous êtes un développeur régulier, vous besoin de connaître les bases des fournisseurs de services Laravel, car ce modèle fait partie intégrante de l'architecture Laravel. Je suis sûr qu'il peut vous faciliter la tâche).

Par exemple, lors de l'installation d'un package, vous devez donner à l'application un accès à ce package - l'une des meilleures solutions est la liste des fournisseurs de services et une façade. D'un autre côté, je ne peux pas imaginer être un développeur Laravel sans connaître les bases des SP-s.

1
carousel