我正在努力了解MVC的最佳实践(使用CakePHP),并试图了解某个任务是否应该在控制器或视图中发生。
以下是该方案:
我有一张用户表。每个用户都有许多与之相关的事件。
在我的控制器中,我将关于用户的内容加载到一个数组中,如下所示:
$this->set('user', $this->User->read());
这导致我可以在我的视图页面上遍历用户数组:
Array
(
[User] => Array
(
[id] => 1
[name] => Jane Doe
[created] => 2011-03-29 15:50:25
[modified] => 1301428225
)
[Event] => Array
(
[0] => Array
(
[id] => 4
[user_id] => 1
[title] => Birthday
[created] => 2011-04-07 17:28:53
[modified] => 2011-04-07 17:28:53
[occured] => 1301889600
)
[1] => Array
(
[id] => 3
[user_id] => 1
[title] => Anniversary
[created] => 2011-04-07 17:21:27
[modified] => 2011-04-07 17:21:27
[occured] => 1301976000
)
[2] => Array
(
[id] => 2
[user_id] => 1
[title] => Graduation
[created] => 2011-04-07 17:20:41
[modified] => 2011-04-07 17:20:41
[occured] => 1301889600
)
)
现在,发生的是我需要转换为友好日期的时间戳。
我应该:
A)在控制器中执行此操作?如果是这样,那么挖掘数组的最佳语法是什么呢?
B)在视图中调用它?
<?=date("d/m/Y,$thisEvent['occured']);?>
后者看起来更干净,代码更少,但我不知道它是否可以/应该从控制器应用它的逻辑。
答案 0 :(得分:6)
如果你要在视图中循环遍历数组以显示事件,我只是将转换放在视图中以节省必须在控制器中循环。
对我来说,日期格式是一种表现形式 - 而不是商业逻辑。
艾米
答案 1 :(得分:3)
经验法则是:瘦模型到瘦视图。 View不应该处理逻辑。期。视图不应该处理数据的更改,它应该只处理显示它。模型是应该进行数据操作的地方。但有时作为编码员,我们想采取最简单的做事方式。这不一定是错的,但并不总是最好的做事方式。
我的建议是以下之一(优先顺序):
1-更改数据库上的日期格式,使其以您要查找的格式显示。然后,日期格式化不需要额外的逻辑。
2-将查询写为连接。 (在这种情况下你应该做什么,因为递归已经开启)。编写连接,以便按预期格式化数据。问题是你使用$ this-&gt; User-Read()来获取快捷方式,这导致你必须在模型之外编写额外的逻辑来处理日期的格式。 Model-&gt; read()有它的用途,这不是其中之一。
3-如果您一直在使用Model-&gt; read()快捷键,您可以构建一个日期助手,您可以从任何给定日期的视图中引用该日期助手。例如,当您在视图中显示该字段时,您将调用:
<?php echo $this->Date->format($thisEvent['occured']); ?>
然后帮助程序将包含以下代码:
function format($date) {
return date('d/m/Y', strtotime($date));
}
这样,如果您决定要更改日期的外观,则只需更改帮助程序(1个位置)而不是所有视图(多个位置)。
答案 2 :(得分:0)
我建议:
模型返回DateTime
个对象或类似对象。这样,控制器或视图可以很容易地在必要时进行日期计算/格式化(良好的可维护性)。
视图,如另一个答案所述,应该尽可能简单(可读性)。使用Smarty +处理特定的 DateTime 对象,我只需在视图中编写{$someItem.someDate}
,并自动格式化日期(根据当前用户的语言),使用我的特定 DateTime 类的__toString()
方法。