Was ist eine Verwendung und ein Zweck der Bindung von Laravel?

Lesezeit: 4 Minuten

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.

Benutzeravatar von Risan Bagja Pradana
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

1430510cookie-checkWas ist eine Verwendung und ein Zweck der Bindung von Laravel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy