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,
你正在进行基于方法的依赖注入,这是完全有效的,但可以说比构造函数的依赖注入更少见。两者都有相似的结果,即注入所需的依赖项,主要区别在于依赖项的范围(方法 vs 类)。
在标准的Laravel/PHP环境中,构造函数注入可能如下所示:
Livewire略有不同,因为你不使用
__construct
函数在Component
中,而是需要使用mount()
函数。假设你已经在
bindings
中正确配置了服务容器,一切应该工作正常。