这个问题是特定于zf2的,但我认为这也可能是一个更普遍的MVC问题。
我在我的mysql数据库中创建了一个列,我的应用程序使用(让我们说一个用户实体的描述字段),它被存储为字符串。此字段是可选的,如果该值从未被程序更改,则将其设置为null。
我正在使用zf2的表网关,所以我有这个表的模型。
现在在我的视图模板中,我检查值是否为空,如果它显示这个用户为"未输入",但我想知道我是否应该在模型中这样做?例如,在这个表的模型中,我检查值是否为空,并将其更改为"Not enter",这样我就可以从模板中删除这个逻辑。但缺点是,当我使用模型对表进行更新时,我可能不得不将其转换回null。
我现在对时间戳也是这样做的。我转换时间戳在我的模型日期字符串之前,他们得到视图层(也许我应该转换时间戳在我的视图模板代替吗?)
大多数zf2开发人员只是在视图模板中处理这个问题,或者在我没有看到的模型中这样做是否有一些优势
例如,在这个表的模型中,我检查值是否为null,并将其更改为"Not enter
"
这是典型的视图约束逻辑。现在你想要渲染"Not enter",也许在另一个UI中你想要显示其他东西。请记住,在视图中包含逻辑本身并不是一个坏主意,它应该只与视图相关。检查一个值是否可用,并相应地执行,这是完全可行的视图逻辑。
我现在对时间戳也是这样做的。我转换时间戳在我的模型日期字符串之前,他们得到视图层(也许我应该转换时间戳在我的视图模板代替吗?)
保持模型层域驱动:使用语义来描述你的域。如果要处理时间戳,PHP的DateTime
类是一个很好的解决方案。使用这些对象,如果不存在,则将其设置为null
。这样你可以保持你的模型层在一起。
一个完美可行的时间戳签名是:
public function setTimestamp(DateTime $timestamp = null) {
//
}
这样你强制变量是一个有效的DateTime
实例,或者你只允许null
。
你的视图层可以包含这样的逻辑:
<?php if ($object->getTimestamp() !== null): ?>
<p><?= $object->getTimestamp()->format('c')?></p>
<?php endif ?>