2013-12-07 12 views
33

Ich habe versucht, es zu googeln, fand aber keine detaillierten Informationen.Laravel 4 - wann Service Provider zu verwenden?

Dienstleister sind eine gute Möglichkeit, um verwandte IoC Registrierungen in einem einzigen Standort. Betrachten Sie sie als eine Möglichkeit, Komponenten in Ihrer Anwendung zu starten.

Nicht aus der Dokumentation zu verstehen. Wird dies nur benötigt, wenn ich Pakete erstelle? Wenn ich also regelmäßig Entwickler bin und einige Pakete nicht in der Öffentlichkeit veröffentlichen möchte, muss ich mich nicht darum kümmern?

Antwort

7

Es gibt nichts, was ein Dienstanbieter tun kann, den Sie nicht einfach in app/start/global.php einfügen können, aber mit einem Dienstanbieter sammeln Sie die gesamte Logik an einem Ort und können Anwendungen modularer entwickeln.

Wenn Sie ein Paket machen, ist ein Dienstanbieter so ziemlich ein Muss.

+0

hmm, ich arbeite mit laravel für 1 Monat oder so und erinnere mich nicht an mich in app/start/global.php –

+0

@ SPeed_FANat1c wo hast du sie dann? 'routes.php'? 'start/global.php' wäre ein viel logischerer Platz für sie, wenn du keine SPs verwendest –

+0

" wo hast du sie dann hingelegt? "Ich bin mir nicht sicher, was meinst du mit dem Wort 'sie'. Sprechen Sie über IoC-Registrierungen? Ich benutze sie nicht. Ich gebe einfach die Contructor-Parameter ein, wenn ich IoC haben will: __construct (Class $ classes, Class1 $ classs1) <- so –

1

In Laravel sind Dienstleister direkt mit der Funktionsweise von IoC-Containern verbunden. Sie ermöglichen eine einfachere und modulere Annäherung an Abhängigkeiten. In der Tat ist es ein großartiges Muster für die Organisation Ihres Codes in einer Bootstrap-Mode (auch außerhalb von Laravel). Ich denke, wenn Sie ein regulärer Entwickler sind, müssen Sie immer noch die Grundlagen von Laravel-Dienstanbietern kennen, denn dieses Muster ist ein wesentlicher Bestandteil der Laravel-Architektur. Ich bin sicher, dass es Ihre Arbeit erleichtern kann. Zum Beispiel, wenn Sie ein Paket installieren, müssen Sie Anwendungszugriff auf dieses Paket geben - eine der besten Lösungen ist die Liste der Dienstanbieter und eine Fassade. Auf der anderen Seite kann ich mir nicht vorstellen, ein Laravel-Entwickler zu sein, ohne die Grundlagen von SP-s zu kennen.

63

Einer der Schlüssel zum Aufbau einer gut ausgerichteten Laravel-Anwendung ist lernen, Serviceprovider als ein organisatorisches Werkzeug zu verwenden. Wenn Sie viele Klassen mit dem IoC-Container registrieren, können alle diese Bindungen beginnen, Ihre app/start-Dateien zu verstopfen. Statt Container Registrierungen in diesen Dateien zu erstellen, erstellen Sie Serviceprovider, die verbundene Dienste registrieren.

Das ist also eine Möglichkeit, die Dienste Ihrer Anwendung an einem Ort zu organisieren, damit sie besser organisiert bleibt. Ein Dienstanbieter muss mindestens eine Methode haben: Registrieren. Bei der register-Methode bindet der Anbieter Klassen an den Container.Wenn eine Anforderung Ihre Anwendung gelangt und der Rahmen wird Boote wird die Register-Methode auf dem Anbieter genannt in der Konfigurationsdatei aufgeführt

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

Dies ist Anbieter Array in app.php Konfigurationsdatei und das ist die HtmlServiceProvider in 'Illuminate\Html\HtmlServiceProvider.php' gespeichert

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']); 
     }); 
    } 

} 

Wenn Laravel bootet, ruft sie diese (register) Verfahren und bei diesem Verfahren gibt es zwei Zeilen, nennt diese Linie zwei Verfahren, registerHtmlBuilder() und registerFormBuilder(), diese beiden Verfahren Komponenten zu den 0.123.Behälter

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

In diesem Fall verwenden, sind beide anonyme Funktionen, die eine Instanz von html/form Klasse gibt, und das ist, warum, wenn Sie

Html::link(...); 

verwenden Oder Formular

Form::input(...); 

Sie Holen Sie die gebundene Klasse aus dem Objekt $app, das für Ihre Anwendung verfügbar ist. In diesem Fall wird 'Html' => 'Illuminate\Support\Facades\Html', verwendet, um die Hauptklasse im Array aliases in der Datei app.php zu aliasieren.

Also, in Laravel, Dienstleister sind eine Möglichkeit, die Dinge in einer netten sauberen Weise zu organisieren, während der Boot-up-Prozess der Anwendung, Laravel läuft alle register Methoden von allen Dienstanbietern so jede Komponente verfügbar ist (gebunden) zum IoC Container, damit Sie in Ihrer Anwendung darauf zugreifen können.

Es ist erwähnenswert, dass, nach dem Aufruf aller register Methoden von Dienstanbietern alle boot Methoden von diesen Dienstanbietern aufgerufen werden. Wenn Sie in diesem Fall einen Service aus der Anwendung (IoC/Service Container) innerhalb der Service Provider-Klasse verwenden müssen, sollten Sie diesen Service von der Boot-Methode aus verwenden, da nicht garantiert ist, dass während der Registrierung von Service Providern ein Service verfügbar ist (innerhalb der Registermethode), weil Dienste über die register Methode jedes Dienstanbieters registriert sind, aber innerhalb der boot Methode können Sie jeden Dienst verwenden, da bis dahin jeder Dienst hoffentlich registriert ist.

Überprüfen Sie diese Antwort Laravel 4 : How are Facades resolved? auch, es kann Ihnen helfen, zu verstehen.

+3

Sehr schöne, einfache Erklärung sowohl der ServiceProvider als auch der Facades (in verknüpfter SO-Antwort). Sollte Teil der offiziellen Dokumentation wirklich sein – Ben

+0

Danke für den Daumen hoch :-) –