Penerokaan mendalam tentang cara menggunakan antara muka/kontrak dalam Laravel
P粉517090748
P粉517090748 2024-02-17 14:27:04
0
1
383

Cuba untuk meningkatkan pengetahuan PHP/Laravel saya, jadi apabila mencipta fungsi baharu saya cuba bekerja dengan antara muka.

Untuk menetapkan tempat kejadian: Syarikat kami telah menukar penyedia debit terus beberapa kali sepanjang tahun dan saya ingin mencipta antara muka ini untuk menjadikan perubahan masa depan lebih "berperancah".

Struktur kod saya:

Antaramuka Aplikasi DirectDebitInterface

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

Perkhidmatan Permohonan 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
);

Penggunaan semasa saya berfungsi tetapi rasa tidak sesuai, berikut ialah titik akhir ujian menggunakan kaedah getAccount():

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

Soalan pertama saya ialah, saya tidak pernah melihat sesiapa menggunakan antara muka dalam tetapan pembolehubah kelas?

Soalan kedua saya ialah, saya menggunakan Livewire untuk memuatkan data tetapi tidak tahu cara menggunakan antara muka.

Ini adalah contoh kod untuk soalan kedua saya:

Contoh AppHttpLivewire

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

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

Kod di atas gagal kerana kaedah memerlukan parameter untuk dihantar, tetapi saya juga tidak boleh membuat instantiate kelas kerana ia adalah antara muka.

Selain merasakan terdapat beberapa jurang asas dalam pengetahuan saya...nampaknya saya berada di landasan yang betul, tetapi penggunaan kelas/antara muka saya tidak disediakan dengan betul.

Ada sebarang cadangan tentang cara memanggil antara muka ini dari dalam kaedah atau adakah ia salah di suatu tempat?

Di sana,

P粉517090748
P粉517090748

membalas semua(1)
P粉615829742

Anda sedang melakukan suntikan kebergantungan berasaskan kaedah, yang sangat sah tetapi boleh dikatakan kurang biasa daripada suntikan kebergantungan berasaskan pembina. Kedua-duanya mempunyai hasil yang sama, iaitu menyuntik kebergantungan yang diperlukan, perbezaan utama ialah skop kebergantungan (kaedah vs kelas).

Dalam persekitaran Laravel/PHP standard, suntikan pembina mungkin kelihatan seperti ini:

private DirectDebitInterface $directDebitor;

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

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

Livewire sedikit berbeza kerana anda tidak menggunakan fungsi __construct函数在Component中,而是需要使用mount().

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

Dengan mengandaikan anda telah mengkonfigurasi bekas perkhidmatanbindings dengan betul dalam , semuanya akan berfungsi dengan baik.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan