用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
里做的重用封装:我个人将数据表的原子操作放在了底层
Model
上面(是基于CI-Base-Model
改的,你可以看一下CI-Base-Model
里的has_many
和belongs_to
配置),另外我继承了CI-Base-Model
自己写了一个CRUD_Model
,这个CRUD_Model
中,几乎靠一些配置项和一些重写,就可以快速生成一个标准CRUD数组,下面可以放出部分源码:我这个模型的思路希望可以对你细化CRUD逻辑有所帮助。