深入探究Laravel中介面/合約的使用方式
P粉517090748
P粉517090748 2024-02-17 14:27:04
0
1
327

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

全部回覆(1)
P粉615829742

你正在進行基於方法的依賴注入,這是完全有效的,但可以說比建構函數的依賴注入更少見。兩者都有相似的結果,即註入所需的依賴項,主要差異在於依賴項的範圍(方法 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中正確配置了服務容器,一切應該可以正常運作。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!