2010-06-03 69 views
3

這已經困擾了我很長一段時間,但現在我有必要找到答案。使用原則來抽象CRUD操作

我們正在研究使用CodeIgniter和Doctrine的相當大的項目。

我們的應用程序有一個前端,也是公司管理區域,用於檢查/更改/刪除數據。

當我們設計的前端,我們簡單地消耗了大部分主義碼的右側控制器:

//In semi-pseudocode 
function register() 
{ 
    $data = get_post_data(); 

    if (count($data) && isValid($data)) 
    { 
    $U = new User(); 
    $U->fromArray($data); 
    $U->save(); 

    $C = new Customer(); 
    $C->fromArray($data); 
    $C->user_id = $U->id; 
    $C->save(); 

    redirect_to_next_step(); 
    } 
} 

顯然,當我們去到做管理的意見代碼重複開始,並考慮到我們是在一個「得到它完成「模式,所以它現在與代碼膨脹臭。

我已經使用模型方法將許多功能(業務邏輯)轉移到模型中,但基本的CRUD並不適合此處。

我打算嘗試將CRUD放入靜態方法,即Customer :: save($ array)[將執行插入和更新,具體取決於prikey是否存在於數組中],Customer :: delete($ id ),Customer :: getObj($ id = false)[如果爲false,則獲取所有數據]。儘管對於32個模型對象(並且在增長),這將變得很痛苦。

此外,有時模型需要進行交互(如用戶數據和客戶數據之間的上述交互),這不能在不破壞封裝的靜態方法中完成。我知道有一些地方需要3個「控制器」,我需要將這個CRUD封裝在某個地方(顯然),但是它們是靜態方法,還是有另一條路?

您的建議非常感謝。

回答

2

爲什麼不使用一個門面?

class RegistrationManager { 
public function register($postData, $callBack){ 
     $data = get_post_data(); 
     if (count($data) && isValid($data)){ 
     $U = new User(); 
     $U->fromArray($data); 
     $U->save(); 
     $C = new Customer(); 
     $C->fromArray($data); 
     $C->user_id = $U->id; 
     $C->save(); 
     $callBack(); //I like this but you need PHP5.3 
     } 
    } 
} 

在你的應用程序控制器:

$r = new RegistrationManager; 
$r->register(get_post_data(), function(){ redirect_to_next_step(); }); 

外立面都是模特太(在我看來),你可以使用它們來隱藏佈線或複雜性和減少代碼的重複數據刪除。

+0

這很有道理。我認爲我太想到了,模型必須以1:1的對象與表關係;需要在箱子外面多思考。謝謝。 – TomWilsonFL 2010-06-12 20:50:38