Ich kann keinen Punkt von Laravels Bindungssystem verstehen. Ich weiß, was Abhängigkeitsinjektion bedeutet. Und es kann auch ohne diese seltsamen “Bindungen” funktionieren, richtig? Ich habe in der Dokumentation gesehen, dass die Bindung ein neues Objekt zurückgeben kann. Warum und wann muss ich das verwenden? Bitte nicht sehr kompliziert erklären, denn ich habe die Dokumentation gelesen und konnte die Verwendung und den Zweck dieser Bindungen nicht verstehen. Vielen Dank.
Was ist eine Verwendung und ein Zweck der Bindung von Laravel?
Risan Bagja Pradana
Und es kann auch ohne diese seltsamen “Bindungen” funktionieren, richtig?
Nicht wirklich. Sicher, es kann gut funktionieren, wenn die erforderlichen Abhängigkeiten einfach zu instanziieren sind. Angenommen, Sie haben diese einfache Klasse Foo
darin gespeichert app
Verzeichnis:
<?php
namespace App;
class Foo
{
public function hello()
{
return 'Hello World';
}
}
Sie können diese Klasse angedeutet eingeben, ohne sie zuerst im Container zu binden. Laravel wird diese Klasse immer noch lösen können. Angenommen, Sie haben es in den Routen folgendermaßen eingegeben:
Route::get('/foo', function (App\Foo $foo) {
return $foo->hello(); // Hello World
});
Wir können sogar noch weiter gehen, sagen wir so Foo
Klasse erforderte eine weitere einfache Klasse Bar
. Unser Bar
Klasse sieht so aus:
<?php
namespace App;
class Bar
{
public function hello()
{
return 'bar';
}
}
Und unser Foo
Klasse sieht jetzt so aus:
<?php
namespace App;
class Foo
{
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
public function hello()
{
return $this->bar->hello();
}
}
Wird Laravel in der Lage sein, den Typhinweis zu lösen Foo
Klasse jetzt? JAWOHL! Laravel wird das immer noch lösen können Foo
Klasse.
Jetzt wird die Ausgabe kommen, wenn unsere Foo
Klasse benötigt etwas komplexere Abhängigkeiten, die konfiguriert werden müssen. Stellen Sie sich vor, dass unsere Foo
Klasse benötigen lediglich den Namen unserer Anwendung. Klar kann man einfach verwenden config('app.name')
innerhalb der Methode der Klasse, aber stellen Sie sich vor, dass dies ein HTTP-Client sein könnte, der ein Konfigurationsarray zum Instanziieren benötigt.
<?php
namespace App;
class Foo
{
public function __construct($appName)
{
$this->appName = $appName;
}
public function hello()
{
return "Hello {$this->appName}";
}
}
Wird Laravel diese Klasse jetzt lösen können? NÖ. Dienstcontainer zur Rettung! Du kannst Laravel beibringen, wie man das löst Foo
Klasse, indem Sie sie in den Dienstcontainer binden. Sie können die Bindung innerhalb der definieren register
Methode an app\Providers\AppServiceProvider.php
Datei:
public function register()
{
$this->app->bind(\App\Foo::class, function ($app) {
// Pass the application name
return new \App\Foo($app->config['app.name']);
});
}
Und manchmal möchten Sie nicht, dass mehrere Instanzen erstellt werden. Wie unsere Foo
Klasse zum Beispiel, es gibt keine Notwendigkeit für mehrere Instanzen für diese Art von Klasse. In diesem Fall können wir es mit der Singleton-Methode binden.
$this->app->singleton(\App\Foo::class, function ($app) {
return new \App\Foo($app->config['app.name']);
});
Wichtigere Verwendung
Die wichtigere Verwendung dieses Servicecontainers besteht jedoch darin, dass wir eine Schnittstelle an seine Implementierung binden können. Sagen wir, wir haben das PaymentProcessorInterface
mit pay
Methode:
<?php
namespace App;
interface PaymentProcessorInterface
{
public function pay();
}
Dann haben wir die Implementierung dieser Schnittstelle benannt StripeProcessor
:
<?php
namespace App;
class StripeProcessor implements PaymentProcessorInterface
{
public function pay()
{
return 'pay with stripe';
}
}
Mit Servicecontainer können wir das binden PaymentProcessorInterface
zu StripeProcessor
Klasse:
$this->app->bind(\App\PaymentProcessorInterface::class, function () {
return new \App\StripeProcessor();
});
Wir können dann mit Hinweisen versehen PaymentProcessorInterface
in unserem Code:
Route::get('/pay', function (App\PaymentProcessorInterface $paymentProcessor) {
return $paymentProcessor->pay(); // pay with stripe
});
Auf diese Weise können wir die einfach austauschen PaymentProcessorInterface
Implementierung. Nehmen wir an, wir möchten den Zahlungsabwickler auf Paypal ändern, dann haben wir dies PaypalProcessor
Klasse.
<?php
namespace App;
class PaypalProcessor implements PaymentProcessorInterface
{
public function pay()
{
return 'pay with paypal';
}
}
Alles, was wir tun müssen, ist die Bindung zu aktualisieren:
$this->app->bind(\App\PaymentProcessorInterface::class, function () {
return new \App\PaypalProcessor();
});
Hoffe, das gibt Ihnen einige Ideen.
-
vielen Dank für das ausführliche Tut 🙂
– Andrii H.
18. März 2018 um 15:46 Uhr
-
Offizielle Dokumentation sollte Leute wie Sie schreiben. Brillant!
– Orange-Man
21. Februar 2020 um 12:51 Uhr
-
Perfektes Klatschen 🙂
– Mama D
8. Dezember 2020 um 8:33 Uhr
lesen Sie dies heera.it/laravel-repository-pattern#.VuJcVfl97cs
– Sapnesh Naik
18. März 2018 um 14:34 Uhr