mata teras
Apakah model gudang?
Cukup, ia adalah pelaksanaan lapisan perantara antara aplikasi dan sumber data. Pihak tidak perlu mengenali satu sama lain untuk melaksanakan tugas masing-masing, yang membolehkan kita mempunyai seni bina yang dipadamkan yang membantu skala dalam aplikasi besar tanpa kebergantungan keras.
Mengapa anda perlu memberi perhatian kepadanya?
mari kita fahami ini dengan contoh. Katakan kami sedang membina kedai dalam talian yang menjual gula -gula berperisa oren. Ia adalah kedai kecil yang menyimpan stok tempatan supaya kami tidak memerlukan apa -apa yang mewah. Aplikasi kedai hanya boleh menyambung ke pangkalan data dan mengambil pesanan dalam talian berdasarkan inventori sedia ada. Ini akan berfungsi dengan baik kerana kedai hanya mempunyai satu gudang bekalan dan kawasan operasi yang terhad. Tetapi apa yang berlaku jika kedai mahu mengembangkan kawasan operasi? Kedai mungkin mahu berkembang ke bandar lain atau di seluruh negara, dan mempunyai sistem inventori pusat akan sangat menyusahkan.Jika kita masih menggunakan model data, maka aplikasi kami akan digabungkan dengan ketat. Aplikasi kedai perlu mengetahui setiap sumber data yang perlu berinteraksi, yang merupakan reka bentuk aplikasi yang buruk. Tugas aplikasi kedai adalah untuk membolehkan pelanggan memesan gula -gula, aplikasi itu tidak peduli dengan sumber data, ia tidak sepatutnya menjejaki semua sumber data yang berbeza. Di sinilah gudang data dimainkan. Menurut corak gudang, API awam didedahkan melalui antara muka, dan setiap pengguna (dalam hal ini aplikasi kedai kami) menggunakannya untuk berkomunikasi dengan sumber data. Sumber data mana yang hendak digunakan atau bagaimana untuk menyambungnya tidak ada kaitan dengan aplikasi itu. Permohonan hanya peduli terhadap data yang diperolehnya dan data yang dikirimkan untuk disimpan.
Setelah corak gudang dilaksanakan, gudang boleh dibuat untuk setiap sumber data. Aplikasi kedai tidak lagi perlu menjejaki sebarang sumber data, ia hanya menggunakan API repositori untuk mendapatkan data yang mereka perlukan.
Adakah ia ubat?
tidak, tidak. Seperti setiap corak reka bentuk, ia mempunyai kebaikan dan keburukannya.
Pro:
Kekurangan:
Bagaimana untuk melakukannya?
mari kita lihat contoh kod mudah. Saya akan menggunakan Laravel dalam contoh saya untuk memanfaatkan fungsi suntikan ketergantungan yang sangat baik. Jika anda menggunakan rangka kerja PHP moden, ia sepatutnya mempunyai suntikan pergantungan/bekas IOC. Melaksanakan corak gudang memerlukan suntikan ketergantungan, kerana tanpa itu anda tidak akan dapat mengikat gudang data anda ke antara muka gudang, dan keseluruhan idea adalah pengaturcaraan berorientasikan antara muka untuk mengelakkan gandingan berkod keras. Sekiranya anda tidak menggunakan rangka kerja atau rangka kerja pilihan anda tidak mempunyai bekas IOC, anda boleh menggunakan bekas IOC di luar (lihat nota kaki).
mari kita mulakan. Pertama, kami menyediakan ruang nama dan autoload kami dalam komposer. Buka composer.json dan tambahkan Autoload PSR-4 ke ruang nama kami (dalam nod autoload, sejurus selepas kelas).
"autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php" ], "psr-4": { "RocketCandy\": "app/RocketCandy" } },
Selepas menyimpan, laksanakan composer dump-autoload -o
di terminal untuk mendaftarkan pemuatan automatik ruang nama baru. Buat app/RocketCandy/Repositories/OrangeCandyRepository/
dalam OrangeCandyRepository.php
. Ini akan menjadi antara muka repositori kami.
<?php namespace RocketCandy\Repositories\OrangeCandyRepository; interface OrangeCandyRepository { public function get_list( $limit = 0, $skip = 0 ); public function get_detail( $candy_id = 0 ); }
Sekarang kita mempunyai antara muka, kita boleh membuat repositori. Buat app/RocketCandy/Repositories/OrangeCandyRepository/
dalam CityAOrangeCandyRepository.php
.
<?php namespace RocketCandy\Repositories\OrangeCandyRepository; class CityAOrangeCandyRepository implements OrangeCandyRepository { public function get_list( $limit = 0, $skip = 0 ) { // 查询数据源并获取糖果列表 } public function get_detail( $candy_id = 0 ) { // 查询数据源并获取糖果详情 } }
Untuk mengikat repositori CityAOrangeCandyRepository
ke antara muka OrangeCandyRepository
, kami akan menggunakan bekas IOC Laravel. Buka app/start/global.php
dan tambahkan yang berikut ke akhir fail.
//OrangeCandyRepository App::bind( 'RocketCandy\Repositories\OrangeCandyRepository\OrangeCandyRepository', 'RocketCandy\Repositories\OrangeCandyRepository\CityAOrangeCandyRepository' );
Nota: Saya hanya meletakkan pengikatan IOC dalam global.php
untuk demonstrasi. Idealnya, ini harus diletakkan dalam fail berasingan mereka sendiri di mana anda boleh meletakkan semua pengikatan IOC dan kemudian memuatkan fail tersebut di sini dalam global.php
atau anda boleh membuat pembekal perkhidmatan untuk mendaftarkan setiap ikatan IOC. Anda boleh membaca lebih lanjut di sini.
Sekarang kita boleh menggunakan repositori melalui antara muka. Dalam app/controllers/
terletak di CandyListingController.php
.
"autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php" ], "psr-4": { "RocketCandy\": "app/RocketCandy" } },
di sini, kami menyuntik antara muka OrangeCandyRepository
ke dalam pengawal kami dan menyimpan rujukan objeknya dalam pemboleh ubah kelas yang kini boleh digunakan oleh mana -mana fungsi dalam pengawal untuk data pertanyaan. Oleh kerana kita mengikat antara muka OrangeCandyRepository
ke repositori CityAOrangeCandyRepository
, ia akan menjadi sama seperti kita menggunakan repositori CityAOrangeCandyRepository
secara langsung.
Jadi, sekarang, jenis dan jenis sumber data adalah satu -satunya kebimbangan CityAOrangeCandyRepository
. Permohonan kami hanya mengetahui antara muka OrangeCandyRepository
dan API yang terdedah, dan setiap repositori yang melaksanakannya mesti mematuhi API itu. Gudang itu dihuraikan dari bekas IOC pada masa yang sama, yang bermaksud bahawa pengikat gudang antara muka boleh ditetapkan seperti yang diperlukan Sumber data kini boleh menjadi pangkalan data, perkhidmatan web atau saluran paip hyperdata silang dimensi.
tidak semua kes dikenakan
Seperti yang saya nyatakan dalam kelemahan corak repositori, ia menambah beberapa kerumitan kepada aplikasi. Oleh itu, jika anda membuat aplikasi kecil dan anda tidak melihatnya berkembang ke titik di mana ia besar (mungkin memerlukan pelbagai sumber data yang dipanggil), lebih baik tidak melaksanakannya dan berpegang pada model data gaya lama. Memahami sesuatu adalah berbeza daripada mengetahui bila menggunakannya. Ini adalah corak reka bentuk yang sangat mudah yang menjimatkan banyak masalah apabila membuat aplikasi dan apabila anda perlu mengekalkan atau melanjutkan (atau mengurangkan) aplikasi, tetapi ia bukan ubat untuk semua aplikasi.
Saya menggunakan kod khusus Laravel untuk menunjukkan pelaksanaan di atas, tetapi ia agak mudah dan serupa untuk mana -mana bekas IOC yang baik. Ada soalan? Sila buat komen di bawah.
Nota kaki:
Berikut adalah beberapa perpustakaan kontena IOC yang boleh anda gunakan jika rangka kerja anda tidak mempunyai atau anda tidak menggunakan rangka kerja:
Membaca yang dicadangkan:
Soalan Lazim mengenai Model Gudang
(bahagian kandungan ini sangat kebetulan dengan teks asal. Untuk mengelakkan pertindihan, ia ditinggalkan di sini. Bahagian FAQ dalam teks asal telah memasukkan penjelasan yang komprehensif mengenai corak gudang.)
Atas ialah kandungan terperinci Corak reka bentuk repositori demystified. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!