Zend框架:验证用户输入的正确位置是什么?

时间:2010-01-28 19:02:36

标签: php zend-framework validation

我想通过'/ index / adduser / id / 7'等链接在users表中添加用户。

问题

我应该验证控制器内部或模型文件内某处的'adduserAction'函数内的用户输入吗?我把包含数据库相关函数的文件放在'models'目录中。假设用户通过'id'添加到表中。此ID通过'get'发送。最后它通过'AddUser'函数(在模型文件内)添加到表中。然后我应该在'adduserAction'或'AddUser'中验证这个'id'。可扩展性方面,在“AddUser”中进行它会更好吗?

5 个答案:

答案 0 :(得分:8)

有一种流行的信仰/范式表明:

瘦控制器,胖模型。

这意味着,您的控制器应该只负责做到最低限度,以确保操作改变模型的状态并提供正确的视图作为回报。考虑到这一点,验证应该在您的模型中进行。但是......等一下。模型不是一层分层。

我相信在.NET程序员中,以下设置(或类似的东西)是一种非常常见的做法(如果项目的规模验证它):

Controller
  -> ServiceLayer
     -> Repository
        -> DataObject

我开始越来越喜欢这种设置了。此外,我相信这种设置在Zend Framework环境中也是非常可行的。

“模型”这个术语有点含糊不清。在上面,您可以将最后三个图层视为模型图层。这三层代表的内容如下:

  • ServiceLayer
    负责业务逻辑。换句话说:从存储库中检索Dataobjects(模型),将模型绑定在一起,在存储模型之前验证模型,邮寄用户等等。
  • 存储库
    某种类型的持久性机制(如数据库),它将DataObjects提供给服务层,并将DataObjects存储回持久性机制(在服务层验证它们之后
  • 数据对象
    您可能会将此视为实际模型。优选地,DataObject具有公共接口(独立于存储库),因此存储库是可互换的。换句话说,当存储库从某个Web服务从数据库更改为XML文件时,DataObject仍然具有与服务层相同的接口,并最终可以使用该视图。

希望这是有道理的。这基本上是我对更加分层的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.survivethedeepend.com/zendframeworkbook/en/1.0/implementing.the.domain.model.entries.and.authors#id1491270

随着您的进展,您无疑会遇到其他问题...有关模型层的评论可能有助于查看我在此问题上的评论:http://www.rvdavid.net/my-zend-framework-model-layer-part-service-part-orm/

希望这可以帮助别人。