Menggunakan ThinkPhp3.2 untuk pembangunan, kerana banyak kali kita perlu menggunakan operasi penambahan, pemadaman, pengubahsuaian dan carian untuk meningkatkan penggunaan semula kod. Saya menulis curdControler dan curdModel yang sama untuk melakukan penambahan, pemadaman, pengubahsuaian dan pertanyaan kod Apabila saya perlu menggunakan penambahan, pemadaman, pengubahsuaian dan pertanyaan, saya terus mewarisi curdController dan curdModel.
Sekarang ada masalah Secara amnya, operasi dadih memerlukan pertimbangan kebenaran, jika tidak ia akan menjadi sangat berbahaya. Idea saya di sini adalah untuk memanggil checkAuth() dalam kaedah pembinaan curdController, kerana pelbagai fungsi, kaedah kawalan kebenaran akan berbeza Bagaimana untuk memaksa subkelas yang mewarisi curdController untuk membebankan kaedah checkAuth?
Idea saya ialah saya mentakrifkan fungsi penghakiman kebenaran sebagai kaedah abstrak
protected abstract function checkAuth()
Kelas curdController ditakrifkan sebagai kelas abstrak, tetapi jika kelas abstrak tidak boleh digunakan, maka kod pembina akan menjadi tidak sah.
Soalan kedua, adakah anda mempunyai idea yang lebih baik apabila menggunakan semula kod TP Apakah bahaya dan masalah yang tersembunyi dari pendekatan saya.
class CurdController extends Controller
{
//基础curd类必须进行权限判断,否则会造成很大的问题
public function __construct()
{
parent::__construct();
$this->checkAuth();
}
//存储模型对象
protected $_model;
//权限判断函数
protected function checkAuth(){}
//列表处理函数
public function listC(){
// 列表前置函数
$this->beforeList();
$data=$this->_model->lists();
$this->assign('lists',$data);
$this->display();
}
public function delC(){
$id=intval(I('get.id'));
$where['id']=$id;
$res=$this->_model->del($where);
$this->redirectUrl($res,'listC');
}
public function addC(){
// 添加前置函数
$this->beforeAdd();
if(IS_POST){
$data=I('post.');
$res=$this->_model->Store($data);
$this->redirectUrl($res,'listC');
}
$this->display();
}
public function editC(){
$id=intval(I('get.id'));
//where的数组形式
$where['id']=$id;
// 编辑前置函数
$this->beforeEdit($where);
if(IS_POST){
$where=I('post.');
$where['id']=$id;
$res=$this->_model->Store($where);
$this->redirectUrl($res,'listC');
}
$this->display();
}
//列表前置操作
protected function beforeList(){
}
/**
* 添加控制器前置操作
*/
protected function beforeAdd(){
}
/**
* 编辑控制器前置操作
* @param $where
*/
protected function beforeEdit($where){
}
Untuk penggunaan semula kod, saya syorkan menggunakan ciri PHP:
http://php.net/manual/zh/lang...
Atau gunakan pengikatan penutupan (tidak disyorkan):
http://php.net /manual/en /tutup...
checkAuth
可以通过不同的业务,书写不同的traits,在具体继承curdController的类中使用对应的traits,由于checkAuth()
只返回校验结果的真假,所以这个可以向任意的Controller中定制checkAuth()
.Sebagai tindak balas kepada soalan pertama anda, memandangkan anda mewarisi kelas abstrak
curdController
的子类构造函数里,手动调用了parent::__construct();
, selagi subkelas dijadikan instantiated, pembina kelas induk juga tersedia. Lihat contoh di bawah:Kod:
Keputusan:
Sebagai tindak balas kepada soalan kedua anda, saya secara peribadi merasakan bahawa keseluruhan rangka kerja struktur adalah agak kasar dan perhubungan satu-ke-banyak dan banyak-ke-banyak masih perlu dilakukan secara manual.
Walaupun rangka kerja yang saya gunakan secara peribadi adalah pakej penggunaan semula yang dibuat dalam
CodeIgniter
,但是我觉得MVC(HMVC)模型基本思路都是一致的,所以下面谈下我个人在CodeIgniter
:Saya secara peribadi meletakkan operasi atom jadual data di lapisan bawah
Model
上面(是基于CI-Base-Model
改的,你可以看一下CI-Base-Model
里的has_many
和belongs_to
配置),另外我继承了CI-Base-Model
自己写了一个CRUD_Model
,这个CRUD_Model
, dan hampir bergantung pada beberapa item konfigurasi dan beberapa penulisan semula, saya boleh dengan cepat menjana tatasusunan CRUD standard sebahagian daripada kod sumber boleh dikeluarkan di bawah:Saya harap idea model saya dapat membantu anda memperhalusi logik CRUD.