【发布时间】:2013-03-14 22:33:43
【问题描述】:
我正在尝试将我当前的项目从使用常规 CI 查询构建器迁移到使用 ORM,因为我的数据库越来越大,而且我有超过 20 个 FK 和表之间的关系。
所以我目前正在为 CI 寻找一个不错的 orm。我找到了 IgnitedRecord,但我遇到了一个大问题。
示例模型/users.php:
class user extends IgnitedRecord {
public function is_loged(){
return $this->session->userdata('user');
}
问题是 $this 不再指向 CI,它返回的 Undefined property: user::$session 与任何 CI 类/库相同。
有没有办法解决这个问题? 还是我需要在每个 i.r. 中使用 $CI =& get_instance();型号?
由于我的模型包含我的大部分应用业务逻辑,我觉得在我的所有模型中都使用$CI =& get_instance(); 有点不舒服,
其他解决方案是将所有逻辑移入控制器!或者丢弃这个 orm 并坚持使用本机查询生成器:p。
** 所以下一个问题** 当使用 orm 时(我之前从未使用过),我应该将我的逻辑移动到控制器并只保留 orm 的模型!!!??
这将破坏我的 DRY 法力,因为很多时候我将属性/方法设置到模型中并从视图/其他控制器访问它们,这是无法在控制器内部完成的功能,因为我无法从视图中引用控制器属性/方法/其他控制器。
问题示例:
class Auth extends CI_Controller{
public $msg='hello world';
function index(){
$this->load->view('login');
}
}
class user extends CI_MODEL{
public $msg='HELLO FROM YOUR MODEL';
}
/*VIEW */
<?
echo $this->user->msg;//WORKS fine.
echo $this->auth->msg;//WILL NOT WORK. will throw an UNIDENTIFIED auth error
?>
另外,我通常设计我的流程,控制器首先加载所有插件(例如:models/plugins/*.php)这些插件设置一些数据属性供主模型使用,在加载所有插件后控制器加载主模型并执行其逻辑并将结果发送回视图:)。
例子
models/plugins/settings.php:
function config(){
$this->msg = 'hello';
$this->user = 'sam';
return;
}
models/hello.php
function replace_sam (){
$new='NONAME';
if($this->settings->user=='sam') return $this->settings->msg.' '.$new
else return $this->settings->msg.' '.$this->settings->user;
}
controllers/home.php
function index(){
$this->load->model('plugins/settings');
$this->settings->config();
$this->load->model('hello');
echo $this->hello->replace_sam();
//echo hello NONAME
}
我希望你能从这个简单的例子中明白我的意思.. 所以你认为我应该重写所有的东西并将逻辑移到控制器上!!
我很欣赏你的意见。所以如果你认为是的,我应该为 orm 留下模型,那么请向我解释这不会是一个巨大的浪费!
【问题讨论】:
-
你能解释一下为什么有一个 $CI =& get_instance();在你的模型中让你不舒服?
-
因为我将不得不重写我的代码。并且 $this 和 $CI 在某些时候可能会混淆,所以我需要再次重新测试整个事情:(
标签: php codeigniter design-patterns orm workflow