2012-05-13 37 views
-1

這是一個通用的場景。我有「任務」,我有「任務事件」。我爲每個表創建了一個數據庫表。我還創建了一個處理從數據庫獲取記錄的模型。什麼是確保通用搜索查詢中正確的子類的策略?

對於「任務事件」,我有幾種類型:創建,接受,評論,關閉。

目前,我做了一些簡單的事情,如$task = new Task($task_id);從數據庫中抓取任務,$task_events = new Tasks_Events($task_id);抓取該任務的事件。然後,我已經實現了Iterator,所以我可以做foreach($task_events as $e) { ... },這一切都很好。

但是,我發現我需要一些專門的處理程序來處理一些事件類型。例如,我創建了Tasks_Events_Comments,它擴展了Tasks_Events,併爲Comment事件類型做了一些額外的處理。我現在意識到,當我收集事件的集合時,我真的需要它們是子類型,所以如果在事件上調用某個方法,就會調用子類型的正確覆蓋。

這裏有一個簡單的例子:

class Model { 
    public function __construct($search = null) { 
     // Hypothetical example, basically query the DB and populate data. 
     if (!is_null($search)) { $this->search($search); } 
    } 
    protected function onAfterUpdate() { } 
} 

class Tasks_Events extends Model { 
    protected function onAfterUpdate() { /* Task Event Specific */ } 
} 

class Tasks_Events_Comments extends Tasks_Events { 
    protected function onAfterUpdate() { /* Task Event Comment Specific */ } 
} 

然後,假設用例:

class Controller { 
    public function updateEvent($task_id, $event_id, $params) { 
     $task = new Tasks($task_id); 
     $task_event = new Tasks_Events($event_id); 

     // Some Analysis of Params 
     $task_event->status = $new_status; 
     $task_event->save(); 
    } 
} 

所以,這裏是關鍵。這樣做,這樣會調用Tasks_Events onAfterUpdate()...

我的問題是,什麼是模型,模式,理念,方法,我可以使用,這樣,當我有任務的活動的集合,和我行動之一,即使我使用的是基類引用,我需要調用子類的函數。

我真的很喜歡的$e = new Tasks_Events(3); $e->status = 4; $e->save();一個解決方案,我有我不喜歡簡單,就是要像做$e = Tasks_Events::Get($id);其中Tasks_Events會查詢數據庫,確定類型,然後做一個「開關」,創建正確的類型被退回。

我不喜歡這個的另一個原因是因爲我已經構建了模型來執行像$tasks = new Tasks(array('user_id' => 5, 'status' => Tasks::STATUS_OPEN));這樣酷的事情,它將構建適當的數據庫查詢並填充用戶5的所有打開的任務。那麼我可以做foreach($tasks as $t) { echo $t->subject; }等。所以,我很想能夠保持這種類型的系統....但我不知道如果我可以,如果我想利用繼承的子類型的優勢。

恐怕我可能需要一個工廠模式,但我希望我可能只是失去了一些東西。

P.S.如果你能想到更好的標題,請隨時改變它。

+0

當你爲一個類調用一個構造函數時,你總是會得到該類的一個實例。沒有辦法繞過它,你需要某種工廠方法。是否有一個原因,你不能只執行'$任務 - > getEvents()'? –

回答

0

謝謝@Sam Dufel,您的評論使我深思熟慮,並意識到我的設計中存在一個主要缺陷。

你提出了$ task-> getEvents()的一個很好的建議,但是我忘記了我的問題中至關重要的一點(缺陷?)。這也可能是我陷入困境的原因......

基本上我實現Iterator的方式,getter/setters可能是問題的根源。由於它迭代了原始記錄的數組。

然後,讓我們說我在迭代器中的位置2。調用$ item->狀態,調用__get($ name),它檢查$this->records[$this->position][$name]!所以,正如你所看到的,我把自己塗在一個角落裏。即使使用工廠模式,由於我在Tasks_Events(好的...模型)中實現了迭代器,argh的工作方式也不太適用。

對不起,你們都打擾。感謝您的想法。

更新:我意識到我所做的是將「DAO」與「模型」與「模型集合」有效地結合在一起。我要分開他們。 DAO-> find()將返回一個模型集合(這將是可迭代的),DAO-> findOne()將返回一個模型。把所有三合一放在一起很方便,但隨着我的需求擴大,它不是非常可擴展的。

相關問題