我应该在控制器或视图(CakePHP)中转换我的时间戳吗?

时间:2011-04-07 21:46:12

标签: model-view-controller cakephp

我正在努力了解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']);?>

后者看起来更干净,代码更少,但我不知道它是否可以/应该从控制器应用它的逻辑。

3 个答案:

答案 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()方法。