搜尋

首頁  >  問答  >  主體

深入探究Laravel中介面/合約的使用方式

試圖增加我的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粉517090748P粉517090748286 天前384

全部回覆(1)我來回復

  • 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中正確配置了服務容器,一切應該可以正常運作。

    回覆
    0
  • 取消回覆