0

我想弄清楚這樣做的最好方法,不知道這是我的編碼還是我只是錯過了一些東西。MVC模式和數據庫設計

我試圖重構我們的內部傳真應用與教條(1.2)和使用MVC - 當收到傳真時,它會進入列表。然後,用戶可以選擇要做的事情 - 目前正在轉發,歸檔或碎化。

當他們挑那些之一,生成傳真工作流操作哪個插入帖子見下表分爲:

fax_id | from_status_id | to_status_id | completed | cancelled 

最初狀態空表示「unactioned」

STATUS_ID在fax_status表中查找一行。

目前,代碼看起來像這樣

Controller: 

function action_shred($fax_id) 
{ 

    $fax = Doctrine_Core::getTable('fax')->findOneById($fax_id); 

    // error handling for checking it exists and belongs to the user 

    $fax->shred(); 

} 

,並在模型

function shred() 
{ 

    $wf = new FaxWorkFlow(); 
    $wf->fax_id = $this->id; 
    $wf->from_status_id = $this->status_id; 
    $wf->to_status_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Shredded")->id; 
    $wf->completed = 0; 
    $wf->cancelled = 0; 
    $wf->save(); 
    $this->status_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Queued")->id; 

} 

我也發現有類似的東西尋找排隊的傳真問題,我必須做到以下幾點:

$queued_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Queued")->id; 
$queued_faxes = Doctrine_Core::getTable('fax')->findByStatusId($queued_id); 

這有沒有什麼問題,或者有沒有更好的方法呢?我只是覺得代碼看起來非常難看,而且在傳真模型中搜索查找值似乎非常困難(應該將它轉移到傳真流模型中嗎?)

對狀態值進行硬編碼是非常誘人的在模型中,但如果它們在未來發生變化,那會導致問題。

總體來說,我只是想找的東西,如果我到目前爲止得到的意見是「正確的」,或者如果我需要看看重新編碼我走的太遠沿着這條路

+0

對於你想要解決的問題,你能更精確一點嗎?是的,代碼是醜陋的 - 我會將「傳真」和「傳真工作流程」分解成單獨的類並隱藏數據庫內容。 – 2011-03-29 07:30:43

+0

我不知道_doctrine_所以也許我的問題很愚蠢,但是......爲什麼你將狀態表建模爲「from_status_id/to_status_id」?我過去曾經在相當複雜的狀態轉換系統上工作過,對我而言,我有「動作」+「狀態」(例如,:「粉碎」/「完成」)感覺更自然。 – 2011-03-29 07:31:15

+0

@ p.marino我這樣建模的原因是因爲一個項目可以多次排隊,所以它提供了一個歷史記錄 - 例如它已經從存檔轉到粉碎。這是工作流程表中的三條記錄 – 2011-03-29 07:56:28

回答

0

我想解決之前在評論中發現兩個問題。首先,模擬完成狀態通常更好,而不是從一個狀態轉換到另一個狀態。例外情況是,當您需要使用遞歸查詢爲具有詳細路徑的圖表建模時,可以一次從單個狀態轉換到其他幾個狀態。否則,from_state_idto_state_id重複沒有任何收穫。最好有一個時間戳字段用於跟蹤事件發生時的狀態,完成的狀態和傳真ID。

第二點是馬修伍德關於使用觸發器自動審計的觀點。根據我的經驗,這往往會導致兩件事情發生,兩者都非常好。首先是審計很難繞過。這就是他所做的。然而,第二個原因是,如果您的審計觸發器依賴於您的應用程序,那麼它會越來越難繞過您的應用程序的安全假設。如果你有這樣的假設是活躍的,如果你以觸發失敗並拋出錯誤的方式違反了它們,你的寫入將被中止。