Heim  >  Fragen und Antworten  >  Hauptteil

Ausführliche Untersuchung der Verwendung von Schnittstellen/Verträgen in Laravel

Ich versuche, meine PHP/Laravel-Kenntnisse zu erweitern, daher versuche ich beim Erstellen neuer Funktionen mit Schnittstellen zu arbeiten.

Um den Rahmen zu schaffen: Unser Unternehmen hat im Laufe des Jahres mehrmals den Lastschriftanbieter gewechselt und ich wollte diese Schnittstelle erstellen, um zukünftige Änderungen „sicherer“ zu machen.

Meine Codestruktur:

Anwendungsschnittstelle DirectDebitInterface

interface DirectDebitInterface {
    public function createAccount($account);
    // additional methods
}

Anwendungsservice DirectDebitClientsBottomline

class Bottomline implements DirectDebitInterface {
    public function getAccount(String $reference)
    {
        // do external API call, return back data
    }
}

AppProvidersAppServiceProvider @register

$this->app->bind(
    DirectDebitInterface::class,
    config('services.direct_debit_clients.' . // Bottomline
    config('services.direct_debit_clients.default') . '.class') // App\Services\DirectDebit\Clients\Bottomline::class
);

Meine aktuelle Nutzung funktioniert, fühlt sich aber nicht richtig an. Hier ist ein Testendpunkt mit der getAccount()-Methode:

public function getAccount(DirectDebitInterface $directDebitInterface)
{
    dd($directDebitInterface->getAccount('OS10129676'));
}

Meine erste Frage ist: Ich habe noch nie jemanden gesehen, der eine Schnittstelle in den Variableneinstellungen einer Klasse verwendet?

Meine zweite Frage ist: Ich verwende Livewire zum Laden von Daten, weiß aber nicht, wie ich die Schnittstelle verwenden soll.

Hier ist der Beispielcode für meine zweite Frage:

AppHttpLivewire-Beispiel

public function mount(Account $account)
{
    self::getDirectDebitAccount();
}

private function getDirectDebitAccount(DirectDebitInterface $directDebitInterface)
{
    dd($directDebitInterface->getAccount($reference));
}

Der obige Code schlägt fehl, weil die Methode die Übergabe eines Parameters erfordert, aber ich kann die Klasse auch nicht instanziieren, da es sich um eine Schnittstelle handelt.

Abgesehen davon, dass ich das Gefühl habe, dass es einige grundlegende Wissenslücken gibt ... scheine ich auf dem richtigen Weg zu sein, aber meine Verwendung von Klassen/Schnittstellen ist nicht richtig eingerichtet.

Irgendwelche Vorschläge, wie man diese Schnittstelle innerhalb einer Methode aufruft, oder läuft es irgendwo schief?

Da,

P粉517090748P粉517090748219 Tage vor326

Antworte allen(1)Ich werde antworten

  • P粉615829742

    P粉6158297422024-02-18 11:23:42

    你正在进行基于方法的依赖注入,这是完全有效的,但可以说比构造函数的依赖注入更少见。两者都有相似的结果,即注入所需的依赖项,主要区别在于依赖项的范围(方法 vs 类)。

    在标准的Laravel/PHP环境中,构造函数注入可能如下所示:

    private DirectDebitInterface $directDebitor;
    
    public function __construct(DirectDebitInterface $directDebitor)
    {
        $this->directDebitor = $directDebitor;
    }
    
    public function doSomething(string $account)
    {
        dd($this->directDebitor->getAccount($account));
    }

    Livewire略有不同,因为你不使用__construct函数在Component中,而是需要使用mount()函数。

    public function mount(DirectDebitInterface $directDebitor)
    {
        $this->directDebitor = $directDebitor;
    }

    假设你已经在bindings中正确配置了服务容器,一切应该工作正常。

    Antwort
    0
  • StornierenAntwort