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

und*_*ack 3 php validation zend-framework

我想通过'/ index/adduser/id/7'这样的链接在users表中添加用户.

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

Dec*_*ler 8

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

薄控制器,胖型号.

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

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

Controller
  -> ServiceLayer
     -> Repository
        -> DataObject
Run Code Online (Sandbox Code Playgroud)

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

模型这个术语在某种程度上是模糊的.在上面,您可以将最后三个图层视为模型图层.这三层代表的是以下内容:

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

希望这是有道理的.这基本上是我对更加分层的MVC设置的理解.如果有人觉得我有混淆的东西请随时纠正我.

但请记住,并非所有项目都尊重这种分层设置.在较小的项目中,您可能只使用1层模型层.在这种情况下,验证应该仍然是模型的责任.控制器应该很薄(仅用于通过操作将模型状态和视图绑定在一起).


Eri*_*era 7

我会说验证在你的模型中.然后,您可以将验证规则保存在中心位置.您的控制器应该如何知道有效用户名的确切长度?这是模范领域.如果用户名长度正确或不确定,您的控制器可以询问模型,但规则本身需要在您的模型中.在我的控制器中,我会做这样的事情:

$ model = new Model; $ model-> loadFromArray(要发布的东西); if(!$ model-> isValid()){forward back to form} $ model-> save();