mata teras
- Corak gudang bertindak sebagai perantara antara aplikasi dan sumber data, yang membolehkan pembinaan seni bina yang dipadam untuk mencapai skalabilitas tanpa memerlukan kebergantungan keras.
- Mod ini membolehkan aplikasi memberi tumpuan kepada menerima dan menghantar data untuk menyimpan tanpa memberi perhatian kepada butiran sumber data. Ia melakukan ini melalui API awam (antara muka) di mana semua pengguna berkomunikasi dengan sumber data.
- Walaupun corak gudang menawarkan manfaat seperti pemisahan kebimbangan dan kemudahan ujian unit, ia juga menambah lapisan abstraksi, yang boleh merumitkan aplikasi kecil.
- Melaksanakan corak gudang memerlukan suntikan ketergantungan, yang membolehkan gudang data terikat pada antara muka gudang. Ini mengelakkan gandingan keras dan memudahkan pengaturcaraan berorientasikan antara muka.
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:
- Pemisahan kebimbangan;
- membolehkan ujian unit mudah, kerana repositori terikat kepada antara muka yang menyuntik kelas pada runtime.
- DRY (Jangan Ulangi Sendiri) Reka bentuk, kod untuk menanyakan dan mendapatkan data dari sumber data tidak akan diulang.
Kekurangan:
- Tambah satu lagi lapisan abstraksi, menambah tahap kerumitan tertentu, menjadikannya terlalu kompleks untuk aplikasi kecil.
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 ) { // 查詢數(shù)據(jù)源并獲取糖果列表 } public function get_detail( $candy_id = 0 ) { // 查詢數(shù)據(jù)源并獲取糖果詳情 } }
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:
- Ornodi
- ray.di
- auryn
- dadu
- Bucket
- ding
-
Membaca yang dicadangkan:
- reka bentuk didorong domain dengan cepat
- Reka bentuk yang didorong oleh domain oleh Eric Evans
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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

TosecurelyhandleAuthenticationandauthorizationInphp, ikuti: 1.alwayshashpasswordswithpassword_hash () andverifyUsingPassword_verify (), usePePreparedStatementStopreventsqlInjection, andStoreUserDatain $ _SessionAsLogin.2.implescureRoleRoleRoleRoleRole

Untuk mengendalikan muat naik fail dengan selamat di PHP, terasnya adalah untuk mengesahkan jenis fail, menamakan semula fail, dan menyekat kebenaran. 1. Gunakan finfo_file () untuk memeriksa jenis mime sebenar, dan hanya jenis tertentu seperti imej/jpeg dibenarkan; 2. Gunakan uniqid () untuk menghasilkan nama fail rawak dan simpannya dalam direktori akar bukan web; 3. Hadkan saiz fail melalui borang php.ini dan html, dan tetapkan kebenaran direktori ke 0755; 4. Gunakan Clamav untuk mengimbas malware untuk meningkatkan keselamatan. Langkah -langkah ini dengan berkesan menghalang kelemahan keselamatan dan memastikan bahawa proses muat naik fail adalah selamat dan boleh dipercayai.

Dalam PHP, perbezaan utama antara == dan == adalah ketat pemeriksaan jenis. == Penukaran jenis akan dilakukan sebelum perbandingan, contohnya, 5 == "5" pulangan benar, dan === meminta nilai dan jenis adalah sama sebelum benar akan dikembalikan, sebagai contoh, 5 === "5" mengembalikan palsu. Dalam senario penggunaan, === lebih selamat dan harus digunakan terlebih dahulu, dan == hanya digunakan apabila penukaran jenis diperlukan.

Kaedah menggunakan operasi matematik asas dalam PHP adalah seperti berikut: 1. Tanda tambahan menyokong bilangan bulat dan nombor terapung, dan juga boleh digunakan untuk pembolehubah. Nombor rentetan akan ditukar secara automatik tetapi tidak disyorkan kepada kebergantungan; 2. Tanda -tanda pengurangan - tanda, pembolehubah adalah sama, dan penukaran jenis juga terpakai; 3. Tanda -tanda pendaraban menggunakan tanda *, yang sesuai untuk nombor dan rentetan yang serupa; 4. Bahagian menggunakan / tanda, yang perlu mengelakkan pembahagian dengan sifar, dan perhatikan bahawa hasilnya mungkin nombor terapung; 5. Mengambil tanda modulus boleh digunakan untuk menilai angka ganjil dan bahkan, dan apabila memproses nombor negatif, tanda -tanda selebihnya selaras dengan dividen. Kunci untuk menggunakan pengendali ini dengan betul adalah untuk memastikan bahawa jenis data adalah jelas dan keadaan sempadan ditangani dengan baik.

Ya, PHP boleh berinteraksi dengan pangkalan data NoSQL seperti MongoDB dan Redis melalui sambungan atau perpustakaan tertentu. Pertama, gunakan pemacu MongoDBPHP (dipasang melalui PECL atau komposer) untuk membuat contoh pelanggan dan mengendalikan pangkalan data dan koleksi, penyisipan sokongan, pertanyaan, pengagregatan dan operasi lain; Kedua, gunakan perpustakaan predis atau lanjutan phpredis untuk menyambung ke REDIS, lakukan tetapan dan pengambilalihan nilai utama, dan mengesyorkan PHPREDI untuk senario berprestasi tinggi, sementara Predis mudah untuk penempatan pesat; Kedua-duanya sesuai untuk persekitaran pengeluaran dan didokumentasikan dengan baik.

Tostaycurrentwithphpdevelopmentsandbestpractices, followeyNewsssourcesLikePhp.netandphpweekly, engageWithCommunitiesonforumsandconference, keeptoolingupdatedandgraduallyAdoptNewFeatures, dan readribcoursourcourceSource

Phpbecamepopularforwebdevelopmentduetoitseaseoflearning, seamlessintegrationwithhtml, widespreadhostingsupport, andalargeecosystemincludingframeworkslikelaravelandcmsplatformsLikeWordPress.itexcelsinhandessubmissions

TosetTheRightTimeZoneinPhp, USEDATE_DEFAULT_TIMEZONE_SET () functionAtthestArtAfyourscriptwithavalididentifiersuchas'america/new_york'.1.usedate_default_timeSet ()
