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。

第二点是马修伍德关于使用触发器自动审计的观点。根据我的经验,这往往会导致两件事情发生,两者都非常好。首先是审计很难绕过。这就是他所做的。然而,第二个原因是,如果您的审计触发器依赖于您的应用程序,那么它会越来越难绕过您的应用程序的安全假设。如果你有这样的假设是活跃的,如果你以触发失败并抛出错误的方式违反了它们,你的写入将被中止。