Rumah > Soal Jawab > teks badan
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粉6158297422024-02-18 11:23:42
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.