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

Model view controller 我应该在控制器或视图(CakePHP)中转换时间戳吗?,model-view-controller,cakephp,Model View Controller,Cakephp,我正在努力了解MVC的最佳实践(使用CakePHP),并试图了解某项任务是否应该在控制器或视图中发生 以下是场景: 我有一个用户表。每个用户都有许多与其关联的事件 在我的控制器中,我将有关用户的内容加载到一个数组中,如下所示: $this->set('user', $this->User->read()); 这将产生一个用户数组,我可以在我的视图页面上循环: Array ( [User] => Array ( [i

我正在努力了解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
                )
        )
现在,Occursed是一个时间戳,我需要将其转换为友好日期

我应该:

A) 在控制器中执行此操作?如果是这样,那么挖掘数组并执行此操作的最佳语法是什么

B) 调用时在视图中执行此操作

<?=date("d/m/Y,$thisEvent['occured']);?>

如果要在视图中循环一个数组以显示事件,我会将转换放在视图中,以避免在控制器中循环

对我来说,日期格式是一种表示方式,而不是一种业务逻辑


艾米

经验法则是:胖模特到瘦模特。视图不应处理逻辑。时期视图不应处理数据的更改,而应仅处理数据的显示。模型是数据操作应该发生的地方。但有时作为编码员,我们希望采取最简单的方式来做事情。这并不一定是错误的,但并不总是最好的做事方式

我的建议如下(优先顺序):

1-更改数据库上的日期格式,使其以您要查找的格式显示。那么,日期的格式就不需要额外的逻辑了

2-将查询编写为联接。(这是在本例中应该执行的操作,因为recursive处于启用状态)。编写连接,以便数据按预期格式返回。问题是您使用$this->User-Read()使用快捷方式,这导致您必须在模型之外编写其他逻辑来处理日期的格式设置。Model->read()有它的用途,这不是其中之一

3-如果你想使用Model->read()快捷方式,你可以构建一个日期助手,你可以在任何给定日期的视图中引用它。例如,当您在视图中显示字段时,您将调用:

那么助手就是包含代码的地方,如下所示:

function format($date) {
   return date('d/m/Y', strtotime($date));
}
这样,如果您决定更改日期的外观,只需更改辅助对象(1个位置),而不必更改所有视图(多个位置)。

我建议:

  • 模型返回
    日期时间
    对象或类似对象。这样,在必要时,可以在控制器视图中方便地对日期进行计算/格式化(良好的可维护性)

  • 视图,如另一个答案所述,应尽可能保持简单(可读性)。使用Smarty+处理特定的DateTime对象,我可以简单地在视图中编写
    {$someItem.someDate}
    ,并使用特定的DateTime类的
    \uu toString()
    方法自动格式化日期(根据当前用户的语言)


它可以分为表示或数据操作。模型还可以,视图更好,因为您已经完成了循环。(在模型中,它将是afterFind中的一个循环)日期格式在很大程度上是一种业务逻辑。我不知道任何CSS或HTML会改变日期的格式。你…吗?CSS和HTML被定义为站点的表示层。这就像说把钱显示为美元或欧元是一种表象,或者下午1:00对13:00,或者(800)888-888对800-888-888,等等,这都是商业逻辑。因为它是特定于数据的,所以它属于模型。如果你不想使用date(),TimeHelper中有一些好东西,例如$this->Time->niceShort()“更少的代码”是导致你首先问这个问题的原因。将$this->User-read()替换为格式化日期的联接查询。然后,您不必编写额外的逻辑来处理日期格式。您可以使用该视图仅显示它。当它在其他地方引起更多的工作时,不要靠蛋糕来使事情变得简单。明白我的意思吗?