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.
hmm, ich arbeite mit laravel für 1 Monat oder so und erinnere mich nicht an mich in app/start/global.php –
@ 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 –
" 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 –