用ThinkPhp3.2做開發,因為很多時候要用到增刪改查操作,為了增加程式碼的複用。我在common寫了一個curdControler和curdModel做程式碼的增刪改查,需要用到增刪改查時直接繼承curdController和curdModel。
現在有一個問題一般curd操作都要做權限的判斷,否則會很危險。我這裡的思路是在curdController構造方法中調用一個checkAuth();因為各種功能,權限控制的方法會有不同,怎麼強制繼承curdController的子類必須重載checkAuth方法了?
我的想法是,我把權限判斷函數 定義為抽象方法
protected abstract function checkAuth()
類別curdController定義為抽象類別,但是抽象類別不能被實例化那麼建構函式的程式碼是不是就無效了,這樣實作有什麼不妥
第二問題,大家在做tp的程式碼重用時,有什麼更好的思路,我這種做法有什麼隱患和問題了,謝謝指教.
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){
}
程式碼重複使用,我建議用PHP的特性:
http://php.net/manual/zh/lang...
或用閉包綁定(不太建議):
http://php.net /manual/en/clos...
checkAuth
可以透過不同的業務,書寫不同的traits,在具體繼承curdController的類別中使用對應的traits,由於checkAuth()
只返回校驗結果的真假,所以這個可以向任意的Controller中客製化checkAuth()
。針對你的第一個問題,由於你在繼承了抽象類別
curdController
的子類別建構子裡,手動呼叫了parent::__construct();
,只要子類別被實例化,父類別的建構函數也是可以用的,看下面範例:程式碼:
結果:
針對你第二個問題,個人覺得整個結構框架有些粗,對於常見的一對多和多對多關係仍然需要手動去做,建議將這種關聯操作也封裝起來。
雖然我個人用的比較多的框架是
CodeIgniter
,但是我覺得MVC(HMVC)模型基本思路都是一致的,所以下面談下我個人在CodeIgniter
裡做的重用封裝:我個人將資料表的原子操作放在了底層
我這個模型的思路希望可以對你細化CRUD邏輯有所幫助。Model
上面(是基於CI-Base-Model
改的,你可以看一下CI-Base-Model
裡的has_many
和配置),另外我繼承了
CI-Base-Model自己寫了一個
CRUD_Model,這個
CRUD_Model中,幾乎靠一些配置項和一些重寫,就可以快速生成一個標準CRUD數組,下面可以放出部分原始碼: