我想通过'/ index / adduser / id / 7'等链接在users表中添加用户。
问题
我应该验证控制器内部或模型文件内某处的'adduserAction'函数内的用户输入吗?我把包含数据库相关函数的文件放在'models'目录中。假设用户通过'id'添加到表中。此ID通过'get'发送。最后它通过'AddUser'函数(在模型文件内)添加到表中。然后我应该在'adduserAction'或'AddUser'中验证这个'id'。可扩展性方面,在“AddUser”中进行它会更好吗?
答案 0 :(得分:8)
有一种流行的信仰/范式表明:
瘦控制器,胖模型。
这意味着,您的控制器应该只负责做到最低限度,以确保操作改变模型的状态并提供正确的视图作为回报。考虑到这一点,验证应该在您的模型中进行。但是......等一下。模型不是一层分层。
我相信在.NET程序员中,以下设置(或类似的东西)是一种非常常见的做法(如果项目的规模验证它):
Controller
-> ServiceLayer
-> Repository
-> DataObject
我开始越来越喜欢这种设置了。此外,我相信这种设置在Zend Framework环境中也是非常可行的。
“模型”这个术语有点含糊不清。在上面,您可以将最后三个图层视为模型图层。这三层代表的内容如下:
希望这是有道理的。这基本上是我对更加分层的MVC设置的理解。如果有人觉得我有混淆的东西,请随时纠正我。
请记住,并非所有项目都尊重这种分层设置。在较小的项目中,您可能只使用1层模型层。在这种情况下,验证应该仍然是模型的责任。控制器应该很薄(仅用于通过操作将模型状态和视图绑定在一起)。
答案 1 :(得分:7)
我想说将验证放在你的模型中。然后,您可以将验证规则保存在中心位置。您的控制器应该如何知道有效用户名的确切长度?这是模范领域。如果用户名长度正确或不确定,您的控制器可以询问模型,但规则本身需要在您的模型中。在我的控制器中,我会做这样的事情:
$ model = new Model; $ model-> loadFromArray(要发布的内容); if(!$ model-> isValid()){forward back to form} $模型 - >保存();
答案 2 :(得分:2)
理想的解决方案是在表单中使用验证 - 即将其附加到您的zend_form_elements - 请参阅http://framework.zend.com/manual/en/zend.form.elements.html
答案 3 :(得分:0)
我在Controller中做,而不是模型。恕我直言,这是更好的地方,因为那时已经清理过的数据在控制器中是安全的。即使在实际保存数据之前,这对比较事物等也是一件好事。
答案 4 :(得分:0)
我知道它已经回答了,但我记得“年轻的我”在网上搜索这样的网站上的一些选择资源,并希望分享我的研究和我在这里做的事情。我做了以下事情:
我使用表单进行输入验证 并过滤我的内部验证 模型
我有一个验证方法 代理表单验证 方法
可以调用此验证方法 内部通过模型方法或外部 通过控制器或视图。
这是一个简单的例子:
//UserModel
class Default_Model_User
{
protected $_form;
public function getForm()
{
if(!isset($this->_form)) {
$this->_form = new Default_Model_Form_User();
}
}
public function validate($data)
{
if($result = $this->getForm()->isValid($data)) {
// if you have custom validation conditions outside of the form, then you
// can do the validation here also.
if($data['controller_entered'] == 'some value') {
$result = false;
}
}
return $result;
}
public function saveUser($data)
{
if($result = $this->validate($data)) {
// do something.
}
return $result;
}
}
如果您还没有阅读,请务必查看以下网址上免费提供的Surviving The Deepend书籍:
http://www.survivethedeepend.com/zendframeworkbook/en/1.0
随着您的进展,您无疑会遇到其他问题...有关模型层的评论可能有助于查看我在此问题上的评论:http://www.rvdavid.net/my-zend-framework-model-layer-part-service-part-orm/
希望这可以帮助别人。