Syarikat kami pada masa ini menggunakan Laravel
开发项目,同时还增加了Biz
层和Repositories
层,来实现业务逻辑封装,反而model
里面什么代码都没有。
在Controller
里写代码的时候,尝尝困扰我的问题是如果复用Biz
对象,Repositories
对象和Model
对象。
以前用Yii
开发项目的时候,有一个工厂模式,所以调用Model
的时候,基本都不new
, yang dipanggil bait menggunakan XXX::model() Cukuplah untuk sesuatu objek menjadi baharu sekali, yang boleh menjimatkan memori dengan berkesan.
Kod pengawal:
$productModel = Product::model()->getList('xxxxxxxxx');
Sederhana kan?
Dalam Laravel
, Model
nampaknya tidak mempunyai kilang Untuk memanggilnya, instance diperlukan Jika Repositori
merangkumi 5 kaedah, setiap satu menggunakan Model
, kemudian saya memanggil lima kaedah ini dalam Controller
dan Model
ialah lima kali baharu. Laravel
里,Model
好像没有工厂,要调用,都需要实例,假如Repositories
里面封装了5个方法,每个都使用了Model
,那么我在Controller
里调用了这5个方法,Model
就被new了5次。
目前在网上看到一种办法,就是在Repositories
Saya pada masa ini melihat cara di Internet, iaitu menyuntik objek Model ke dalam pembina Repositories
dan meletakkannya dalam pembolehubah ahli persendirian Repositori Dengan cara ini, semua lima kaedah boleh memanggil pembolehubah persendirian kelas semasa. Tetapi ia menyusahkan untuk digunakan Semasa menulis kod dalam Pengawal, anda perlu menulis seperti ini:
$xxxBiz = new XXXBiz(\xxx\xxx\Repositories);
Anda perlu menulis ini dalam Repositori:
$xxxRepositories = new XXXRepositories(\xxx\xx\xxxModel);
Terdapat objek Biz
的时候,还必须传入Repositories
dalam bentuk baharu, dan ruang nama saya pada asasnya mengeja rentetan Kecekapan menulis kod adalah sangat rendah.
Saya ingin bertanya bagaimana anda menyelesaikan masalah penggunaan semula kelas lapisan logik seperti Model semasa membangunkan projek dengan Laravel?
0x0 Prakata
Persoalan yang menarik, Yii juga diiktiraf dalam industri sebagai rangka kerja dengan prestasi yang lebih tinggi daripada Laravel. Jadi saya ingin melihat pelaksanaan khusus dua rangka kerja utama hanya dari struktur ActiveRecord.
0x1 rangka kerja fasih untuk Laravel
Mudah untuk menggunakan pertanyaan hubungan dalam Laravel:
Saya tidak menemui kaedah cari dalam kelas Pengguna, WTF, apa yang berlaku! ?
Kelas asas Pengguna ialah Model, yang menggunakan panggilan statik, jadi kaedah ajaib __callStatic Model akan dipanggil:
Malah, ia adalah untuk memanggil kaedah sihir __panggilan semula:
Menjejak kembali ke sumber, kami mendapati bahawa kaedah cari sebenarnya berasal daripada IlluminateDatabaseEloquentBuilder, dan kelas ini secara dalaman menggunakan pelaksanaan IlluminateDatabaseQueryBuilder.
Tunggu sebentar, apakah perbezaan antara IlluminateDatabaseEloquentBuilder dan IlluminateDatabaseQueryBuilder?
Malah, EloquentBuilder ialah enkapsulasi lanjut QueryBuilder untuk melaksanakan pertanyaan objek hubungan dengan lebih baik.
Jadi, proses sebenar ialah:
Dalam erti kata lain, setiap kali anda memanggil secara statik kaedah Model, Model akan disegerakan dan prosesnya akan selesai.
0x2 CActiveRecord dalam Yii 1.1
Memandangkan penyoal menggunakan kaedah model, ia mestilah versi 1.1. Modul mewarisi daripada CActiveRecord (dalam Yii2, ia mewarisi daripada YiidbActiveRecord).
Baiklah, kawan-kawan, sekarang gunakan Yii untuk melaksanakan pertanyaan hubungan, mula-mula takrifkan:
Pertanyaan:
Jelas sekali objek pertanyaan datang daripada model, mari lihat bagaimana kelas induk melaksanakan fungsi ini:
kaedah findAllByPk terkandung terus di dalam CActiveRecord:
Jadi prosesnya ialah:
Suntikan Ketergantungan 0x3 menggunakan Laravel
Dalam keadaan biasa (pembina tanpa parameter atau parameter yang disuntik telah dikonfigurasikan), Laravel akan membuat seketika secara automatik untuk anda:
Jadi anda boleh menggunakan semula objek yang sama dengan mudah:
Selepas melaksanakan gudang, adakah anda perlu membuat instantiat secara manual:
Tidak, ini tidak selaras dengan falsafah Laravel, anda boleh melakukannya semudah:
Ya, betul, anda tidak perlu membina secara manual, memasukkan contoh Pengguna, dll., semuanya hanyalah suntikan automatik yang mudah. Dan penyoal menyedari bahawa ruang nama digunakan di sini, jadi anda hanya perlu menggunakannya sekali. (Sudah tentu, jika anda tidak mahu mengeja ruang nama yang begitu panjang, maka sudah tiba masanya untuk anda menukar kepada IDE. Anda boleh menggunakan Alt + Enter untuk mengimport dengan cepat dalam PhpStorm
0x4 Akhirnya
Untuk isu overhed statik dan bukan statik, terdapat perbincangan mengenai StackOverflow: http://stackoverflow.com/questions/14727...
Jadi dalam analisis akhir, ia masih bergantung kepada keperluan perniagaan 23333
Melalui suntikan pergantungan
Ia boleh disuntik terus ke dalam Pengawal
Anda boleh membaca artikel ini
http://slides.com/howtomakeaturn/model#/
Saya andaikan anda masih belum tahu banyak tentang Laravel.
Pertama, Model Laravel ialah model, yang tidak memerlukan instantiasi yang jelas Kaedah panggilan adalah seperti berikut (diekstrak daripada dokumentasi rasmi):
Kedua, penerangan anda salah. Apa yang anda cari bukanlah corak kilang, tetapi corak tunggal Objek hanya perlu dibuat seketika semasa kitaran hayat permintaan. Dalam Laravel, anda perlu menggunakan bekas IOC (penyongsangan kawalan) atau bekas perkhidmatan. Seperti ini:
Di atas hanyalah petikan ringkas Untuk penggunaan khusus, sila rujuk dokumentasi rasmi Laravel yang sangat baik.
Syarikat kami mewarisi BaseRepository, yang ditakrifkan dalam BaseRepository
CouponRepository
Serupa dalam Biz, warisi BaseBiz, dan kemudian tulis kaedah seperti ini
Dipanggil masukPengawal
Pengawal --->
Ini yang saya lakukan, buat fungsi ini dalam model asas
Ubah suai bootstrap/app.php dan AppServiceProvider.php
Untuk butiran, sila rujuk Pembekal Perkhidmatan
Panggil Foo::load() sahaja dalam pengawal