Rumah > pembangunan bahagian belakang > tutorial php > Corak reka bentuk repositori demystified

Corak reka bentuk repositori demystified

Lisa Kudrow
Lepaskan: 2025-02-21 08:54:13
asal
737 orang telah melayarinya

Repository Design Pattern Demystified

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"
        }
    },
Salin selepas log masuk
Salin selepas log masuk

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

}
Salin selepas log masuk

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 ) {
        // 查询数据源并获取糖果详情
    }

}
Salin selepas log masuk

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'
);
Salin selepas log masuk

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"
        }
    },
Salin selepas log masuk
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan