我想弄清楚这样做的最好方法,不知道这是我的编码还是我只是错过了一些东西。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);
这有没有什么问题,或者有没有更好的方法呢?我只是觉得代码看起来非常难看,而且在传真模型中搜索查找值似乎非常困难(应该将它转移到传真流模型中吗?)
对状态值进行硬编码是非常诱人的在模型中,但如果它们在未来发生变化,那会导致问题。
总体来说,我只是想找的东西,如果我到目前为止得到的意见是“正确的”,或者如果我需要看看重新编码我走的太远沿着这条路
对于你想要解决的问题,你能更精确一点吗?是的,代码是丑陋的 - 我会将“传真”和“传真工作流程”分解成单独的类并隐藏数据库内容。 – 2011-03-29 07:30:43
我不知道_doctrine_所以也许我的问题很愚蠢,但是......为什么你将状态表建模为“from_status_id/to_status_id”?我过去曾经在相当复杂的状态转换系统上工作过,对我而言,我有“动作”+“状态”(例如,:“粉碎”/“完成”)感觉更自然。 – 2011-03-29 07:31:15
@ p.marino我这样建模的原因是因为一个项目可以多次排队,所以它提供了一个历史记录 - 例如它已经从存档转到粉碎。这是工作流程表中的三条记录 – 2011-03-29 07:56:28