2013-03-25 19 views
2

我試圖從我的當前項目遷移使用常規CI查詢生成器來使用ORM,因爲我的數據庫越來越大,我有更多的20 FK和表之間的關係。Codeigniter MVC,我應該將我的業務邏輯從模型轉移到控制器以使用ORM嗎?

所以我目前正在尋找一個很好的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。

** SO接下來的問題**當使用orm's(我之前從未使用過一個)時,我應該將邏輯移動到控制器,並且只保留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 
?> 

另外的方式我設計我的通常流程是控制器啓動通過加載的所有插件(比如:型號/插件/ * 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 
    } 

嗯,我希望你得到了這個簡單的例子,我的觀點..所以你覺得我應該重寫每一件事情和移動邏輯控制器!

我很欣賞你的意見。所以,如果你認爲是的,我應該離開模型,然後請向我解釋這不會是一個巨大的浪費!

+0

你能解釋爲什麼有一個$ CI =&get_instance();在你的模型中讓你感到不舒服? – devrooms 2013-03-25 18:19:56

+0

因爲我將不得不重寫我的代碼。並且會有$ this和$ CI在某些時候可能會混淆,所以我需要重新測試整個事情:( – Zalaboza 2013-03-27 12:32:07

回答

1

如果你看看system/core/model.php,你會發現它是一個非常簡單的類。所需要的是在需要時撥打$CI =& get_instance()。因此,將相同的__get()方法添加到您的課程中將使它們與內置的方法一樣好。

相關問題