【问题标题】:Best Practice PHP MVC Question最佳实践 PHP MVC 问题
【发布时间】:2009-08-05 02:28:04
【问题描述】:
我正在使用 CodeIgniter 在 PHP 中创建一个日历应用程序。在主日历页面中,我的模型当前创建了一个数组,其中每个索引都是当月的一天。那一天是一个数组,其中包含用户在那一天可能发生的任何事件。现在,我应该先在控制器中构造日历数组,然后将其传递给模型,以便模型可以访问数据库并填写所有事件,还是应该只创建日历数组并在模型中填写事件 ALL ?
$month = array('blank', 'blank', 'day1' => array( event 1, event2), 'day2' => ... );
【问题讨论】:
标签:
php
model-view-controller
codeigniter
【解决方案1】:
这是一个困难的问题,我不确定每个人都会这样做......但我认为应该考虑以下几点:
- 如果要从应用程序的多个部分使用模型的方法(例如,已经调用它的控制器、批处理程序和 SOAP Web 服务接口),这可能意味着从多个 Controller 方法中调用,问题是:您希望数组是什么样的?
- 如果它每次都需要包含相同的东西("full array"),那么,为了避免复制粘贴,你应该把你的代码放在模型中
- 如果它只需要在一种情况下包含“完整的东西”,那么,你的“特殊代码”可以在控制器中——或者在另一个模型方法中,在这种特殊情况下,控制器会调用它,并调用现有的来获取数据。
- 另一种方法是在控制器和模型之间添加一个层...毕竟这可能不是一个坏主意...
- 如果仅当您正在讨论的代码已执行时,数组才被视为“整体”,那么,我认为将代码放入模型中是有意义的
- 如果该代码是某些业务逻辑规则的一部分,则它在模型层中占有一席之地;另一方面,如果它只与演示相关,则它的位置将在视图中。
- 如果你的模型方法被称为“
getData”,它应该只返回包含“真实”数据的数组,而不是包含“空”天的数组;另一方面,如果它被称为“getEventsByDay”,那么让它每天返回一些东西是有意义的,甚至是空的
- 您应该尝试为您的模型方法提供一个一致的接口:如果保存数据的接口采用某种数组,则从数据库加载数据的接口应该返回相同类型的数组;我的意思是,
$model->save($model->load()) 之类的东西应该可以工作
最后,没有“好答案”:“看情况”^^
我真的不知道在你的情况下我会怎么做;我想这有点取决于应用程序的其余部分......我会问自己的问题是“空天的概念对我的模型有意义,还是只是一个演示问题?”
【解决方案2】:
我可能会设计它,以便它可以“双向”工作。模型的输出应该是一个标准化的数组,大概是这样的:
array('2009-08-05' => array('event' => ..., ...), '2009-08-06' => array(...));
即只是纯粹的数据。
默认情况下,它可以输出当前月份,或者从现在到 +1 个月之间的所有内容。它也应该需要一个参数来改变默认行为。采用日期数组或范围。
我不知道为什么您的示例中的前两个条目是“空白”。如果您的数组已经代表日历表上显示的一个月,那么这将不利于 MVC。此类演示问题将在视图中加以考虑。