Cara Membuat Service Provider, Contract, Services, Facades, Service Container Pada Laravel
Jika Anda masih takut dengan frasa seperti itu, maka jangan khawatir, ini benar-benar normal. Jika Anda tidak lagi baru di Laravel dan masih menyembunyikan fakta bahwa semua sistem di atas masih perlu dikenali dan dipahami, ini adalah norma. Kami semua ada di sana.
Saya sendiri baru-baru ini menyadari perlunya pola-pola ini untuk pengembangan dan berkontribusi pada proyek ini di Symfony. Anda dapat berhasil membuat kode aplikasi pada Laravel dengan kompleksitas sedang selama bertahun-tahun dan melakukannya dengan aman tanpa penyedia layanan, fasad khusus, dan pemahaman tentang cara kerjanya. Diuji dalam pengalaman saya :) Tetapi pada satu titik saya merasa malu pada diri saya sendiri karena kemalasan dan kecerobohan seperti itu. Dan saya memutuskan untuk duduk dan mencari tahu. Trik ini benar-benar berhasil! Dalam segala hal dalam pemrograman, cukup duduk dan mencari tahu. Dan semuanya tersedia untuk dipahami.
Semua istilah ini hanyalah nama yang indah untuk mekanisme sederhana, dan ketika Anda memahami betapa sederhananya mekanisme ini, Anda tidak akan memaafkan diri sendiri karena kurang mengenal mereka selama ini.
Jangan ulangi kesalahan saya. Duduk dan cari tahu. Dan sekarang saya akan mencoba membantu Anda dengan ini. Mungkin gaya artikel saya tidak dibedakan oleh keakuratan penyajiannya tetapi lebih bersifat jurnalistik, tetapi bagi yang membutuhkan buku teks, selamat datang di dokumen resmi;)
Saya akan segera melakukan reservasi — Anda dapat memahami bagaimana semua mekanisme ini bekerja dengan tingkat pengetahuan dan pengalaman apa pun dalam pemrograman. Tetapi untuk memahami untuk apa menggunakannya, untuk benar-benar merasakan, merasakan kebutuhan dan berseru, “Bagaimana saya hidup tanpa ini sebelumnya ?!” mungkin hanya setelah pengalaman mengembangkan aplikasi yang kompleks.
Saya akan mulai dari yang sederhana sehingga contoh-contoh berikutnya menjadi lebih kompleks dan bertambah rumit dengan memasukkan lebih banyak mekanisme abstraksi di Laravel.
Contracts
Ini hanya sebuah antarmuka. Itu dia. Itu saja yang perlu Anda ketahui. Jika Anda tahu cara kerja antarmuka dan pewarisan di PHP, Anda tahu segalanya tentang kontrak.
Jika Anda berbicara dengan benar, maka kontrak adalah alat yang ampuh yang memungkinkan Anda membedakan logika tingkat tinggi dari detail dan kinerja implementasi.
Contoh kasus sederhana: Anda harus menyimpan gambar dalam aplikasi melalui penyimpanan cloud dan langsung ke disk. Dan kebetulan Anda perlu menggunakan kedua mode penyimpanan secara bersamaan. Agar tidak bingung, Anda membuat antarmuka dengan daftar metode ketekunan dan kemudian mewarisinya untuk implementasi yang berbeda. Bagaimana jika menyimpan ke cloud lain ditambahkan? Tidak masalah, Anda selalu dapat membuat pelaksana kontrak lain.
Penempatan kontrak bersifat arbitrer, tetapi saya sarankan untuk meletakkannya di folder terpisah di App/Contracts.
Contoh kontrak:
SaveImage.php
interface SaveImage{
public static function save();
public static function delete();
}
Pelaksana: penempatannya sewenang-wenang, tetapi saya sarankan meletakkannya di folder terpisah di Aplikasi/Pembantu:
Pelaksana untuk menyimpan ke disk
SaveImageDisk.php
class SaveImageDisk implements SaveImage{public static function save(){
// process saving on disk
}public static function delete(){
//process deleting from disk
}
}
Pelaksana untuk menyimpan ke server cloud:
SaveImageAws.php
class SaveImageAws implements SaveImage{public static function save(){
// process saving on aws
}public static function delete(){
//process deleting from aws
}
}
Jangan lupa namespace dan semua penggunaan relatif terhadap aplikasi Anda! Jika perlu, kita cukup menggunakan satu atau lain pelaksana, misalnya:
SaveImageDisk::save();
SaveImageAws::delete();
Artikel Terkait Lainnya :
Service Providers
Oke, Google, bagaimana jika saya tidak perlu menggunakan kedua implementasi menyimpan gambar secara paralel, tetapi saya hanya perlu beralih dengan mudah dan cepat mode dari "save to disk" ke "save to cloud" dan sebaliknya dan tanpa ctrl+shift +F yang membosankan ini di seluruh proyek dengan koreksi otomatis?
Anda berada di alamat. Kata-kata mengerikan dari Penyedia Layanan sekarang akan menjadi manna dari surga untuk Anda. Penyedia layanan hanya memberikan kesempatan ini untuk beralih dengan mudah di antara implementasi. Tidak percaya? Mari kita lihat.
Mari segera buat penyedia layanan dan lihat apa saja isinya:
php artisan make:provider SaveImageServiceProvider
Di folder Penyedia kami akan menemukan kelas baru, kami tertarik dengan fungsi register, tambahkan kode ke dalamnya:
SaveImageServiceProvider.php
public function register(){
$this->app->bind(‘App\Contracts\SaveImage’, function(){
return new saveImageAws();
//return new saveImageDisk();
});
}
Kami memberi tahu aplikasi bahwa ketika 'App\Contracts\SaveImage' dipanggil, biarkan ia mengembalikan objek baru dari kelas pelaksana saveImageAws.
Artinya, dalam kode kami menggunakan formulir berikut:
App\Contracts\SaveImage::save();
Dan metode save akan berasal dari kelas saveImageAws. Di penyedia, mudah untuk mengubah pelaksana untuk menyimpanImageDisk hanya dengan membatalkan komentar dan mengomentari yang lama. Ada semacam substitusi yang terjadi di sini. Kami tampaknya Kami langsung ke antarmuka dan ada sesuatu dari polimorfisme di sini, tetapi tidak, semuanya jauh lebih dangkal, kami hanya merujuk ke string kunci dalam wadah layanan, dan bukan ke antarmuka di folder Kontrak.
Mari selesaikan proses pendaftaran penyedia baru dengan menambahkannya ke array 'penyedia' di app.php, hanya di wadah layanan yang sama, yang dijelaskan di bawah ini.
Omong-omong, jika Anda ingin membuat hanya satu objek dari kelas pelaksana, Anda ingin memastikan ini — gunakan alih-alih mengikat — singleton.
Service Container
Ini adalah array kontainer global dari semua penyedia layanan yang tersedia. Sama seperti yang kita buat di atas. Ya, ya, ini dia, injeksi ketergantungan, legendaris. Ada banyak cara untuk menyuntikkan dependensi dalam suatu kerangka kerja, dan ini adalah salah satunya.
Facades/Fasad
Tetapi jika Anda, teman saya, adalah orang yang pemilih dan tahu bahwa menulis metode statis bukanlah feng shui dan Anda ingin kode Anda mudah dimengerti dan intuitif — selamat datang di dunia fasad!
Ini di sini favorit saya. Ini juga terkait dengan substitusi konsep (baik, atau dengan gula sintaksis). Berbicara dengan benar, fasad menyediakan antarmuka statis ke kelas yang terdaftar dalam wadah layanan. Sederhananya, jika Anda memiliki fungsi non-statis di kelas, Anda akan dapat mengaksesnya sebagai statis dalam sintaks singkat tanpa membuat objek kelas menggunakan fasad. Bagaimana ini terjadi? Kelas Facade menggunakan metode ajaib PHP __callStatic() untuk mengalihkan panggilan metode dari fasad Anda ke objek yang dihasilkan.
Mari kita buat ulang kelas kontrak dan pelaksana kita yang halal:
SaveImage.php
interface SaveImage{
public function save();
public function delete();
}
SaveImageDisk.php
class SaveImageDisk implements SaveImage{public function save(){
// process saving on disk
}public function delete(){
//process deleting from disk
}
}
SaveImageAws.php
class SaveImageAws implements SaveImage{public function save(){
// process saving on aws
}public function delete(){
//process deleting from aws
}
}
Dan mari kita mulai membuat fasad di folder App/Facades:
SaveImage.php
class SaveImage extends Facade{
protected static function getFacadeAccessor(){
return ‘App\Contracts\SaveImage’;
}
}
Kami mengembalikan kunci string untuk mengakses sel tertentu di Wadah Layanan, yang telah kami ikat di Penyedia Layanan, yaitu 'App\Contracts\SaveImage'.
Untuk mengakses fasad baru kita dengan alias yang dipersingkat, sembunyikan detail implementasi dan keberadaan eksplisit mekanisme fasad — di app.php dalam larik 'alias' kita tambahkan:
‘SaveImage’ => ‘App\Facades\SaveImage::class’
Dan sekarang kami menggunakan mekanisme ini sebagai:
SaveImage::save();
Kode ini setara dengan yang berikut:
$app = app();
$app->make(‘SaveImage’)->save();
Fungsi simpan akan tetap diambil dari kelas pelaksana saveImageAws, meskipun fungsinya tidak statis — sekarang kita dapat menyebutnya sebagai statis.
Jangan lupa, SaveImage hanyalah sebuah alias, sebuah string. Harus ditambahkan untuk menggunakan SaveImage.
Jika Anda tidak menambahkan entri dalam larik 'alias' di app.php dengan kunci SaveImage, maka Anda dapat menggunakan kelas "kelebihan beban" Anda melalui fasad secara langsung:
App\Facades\SaveImage::save();
Semua mekanisme di atas relevan untuk aplikasi yang sangat besar. Dalam sebagian besar kasus, injeksi ketergantungan melalui konstruktor sudah cukup. Penggunaan pola dan layanan fasad yang tidak tepat dapat menyebabkan malam tanpa tidur. Secara umum — bereksperimen, belajar, tetapi gunakan pengetahuan untuk kebaikan dan kepantasan. Ingatlah bahwa kemungkinan besar setelah Anda akan ada orang lain yang akan mengedit kode ini.