試圖增加我的PHP / Laravel知識,所以在創建新功能時,我嘗試使用介面進行工作。
為了設定場景:我們公司在一年內幾次更改了直接借記供應商,我希望創建這個介面以使未來的變更更加「腳手架化」。
我的程式碼結構:
應用程式\介面\DirectDebitInterface
#interface DirectDebitInterface { public function createAccount($account); // additional methods }
應用程式\服務\DirectDebit\Clients\Bottomline
class Bottomline implements DirectDebitInterface { public function getAccount(String $reference) { // do external API call, return back data } }
App\Providers\AppServiceProvider @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 );
我目前的用法是有效的,但感覺不正確,這是一個使用getAccount()方法的測試端點:
public function getAccount(DirectDebitInterface $directDebitInterface) { dd($directDebitInterface->getAccount('OS10129676')); }
我的第一個問題是,我從來沒有看過有人在類別的變數設定中使用介面?
我的第二個問題是,我正在使用Livewire載入數據,但無法弄清楚如何使用介面。
這是我第二個問題的範例程式碼:
App\Http\Livewire\範例
#public function mount(Account $account) { self::getDirectDebitAccount(); } private function getDirectDebitAccount(DirectDebitInterface $directDebitInterface) { dd($directDebitInterface->getAccount($reference)); }
上述程式碼失敗,因為該方法需要傳入一個參數,但我也不能實例化該類,因為它是一個介面。
除了感覺我的知識中存在一些基本差距之外...似乎我走在正確的軌道上,但我對類別/介面的使用設定不正確。
對於如何從方法內部呼叫此介面或在某些地方出錯的任何建議?
那裡,
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
中正確配置了服務容器,一切應該可以正常運作。