2011-07-25 29 views
1

我目前在CodeIgniter中做一個應用程序,我想知道如何處理模型。我的方式有它成立的那一刻:CodeIgniter - MVC方法問題

瀏覽次數:顯示 控制器:顯示有關的東西,表單驗證,重定向,跟圖書館等 庫:做繁重,聊到模型,生成錯誤消息,日誌等 型號:聊到DB

(我目前使用的大部分事情的Active Record)

讓我直奔一個例子:

我有一個驗證庫,裏面我有疑問這個區域有點類似,僅由WHERE子句中的值改變。

例:

get_by_id($id); 
get_by_password_hash($email); 
get_by_email($email); 

我應該有一堆這些重複的模型功能,或者我應該只是一個簡單的函數,我通過WHERE子句,並通過圖書館諸如此類的東西?

例:

$where = array('id' => $id); 
get($where); 

請讓我知道如果你想我澄清什麼。 在此先感謝。

回答

1

如果您對給定模型有很多get_by_*方法,那麼使用TaylorOtwell建議的魔術方法確實有意義。實際上,__call方法以及__get__set在其他框架中經常使用,以便您可以輕鬆地完成您正在討論的內容。只要記住CI在映射時不會在控制器上使用__call Magic方法,但它不會影響模型。

基本辦法,我看CMV在CI:

  • 庫 - 這哪裏是「呈現邏輯」的大部分情況,但一般應控制/模型/視圖無關。幾乎完全無國籍(我的偏好)。
  • 助手 - 實用功能,主要是查看相關的(一切是真的富裕作爲一個庫(更正交,亞達,亞達,亞達))
  • 控制器 - 加載庫/模型,並調用方法
  • 模型 - 數據包環繞層。幾乎完全有狀態(我的偏好)。
  • 視圖 - 顯示數據

通常情況下,控制器會做這樣的事情:

class Users 
{ 
    function display($id) 
    { 
     $this->load->library('myformatlib'); 
     $this->load->model('mymodel'); 
     $data = $this->mymodel->get_user($id); 
     $formatted = $this->myformatlib->addColors($data); 
     $this->mymodel->incrementViews($id); 
     $this->load->view('full_user', $formatted); 
    } 
} 

至於通過WHERE子句 - DB查詢應幾乎完全被降級的模式,除非有沒有其他選擇,否則這樣做會過於繁瑣(但我會懷疑你是否不能重構)。

1

你可以使用PHP的__call Magic Method你的模型來處理任何簡單的where子句:

public function __call($method, $parameters) 
{ 
    if (strpos($method, 'get_by_') === 0) 
    { 
     $this->get(array(substr($method, 7), $parameters[0])); 
    } 
} 
1

我確切地知道你在哪裏,因爲我在幾個月前有同樣疑惑的到來。

我用https://bitbucket.org/philsturgeon/codeigniter-base-model/src/93a643d0d46f/MY_Model.php

只是用它作爲一個庫。您創建模型爲

// user_m.php 
<?php (defined('BASEPATH')) OR exit('No direct script access allowed'); 
class User_m extends MY_Model 
{} 

上面可以有任何自定義功能,而不是基本的CRUD。

你在你的控制器

$this->load->model('user_m'); 
    $this->data['user'] = $this->user_m->get($user_id); 

$this->load->model('user_m'); 
    $this->data['user'] = $this->user_m->get_by(array('something_id' => $something)); 

它得到了所有你需要的基本的CRUD操作運行的代碼。只要閱讀代碼,它的文檔也很好記錄。