Model view controller MVC应用程序中的输入验证属于哪里?

Model view controller MVC应用程序中的输入验证属于哪里?,model-view-controller,language-agnostic,model,controller,Model View Controller,Language Agnostic,Model,Controller,我有一个从表单接收输入的MVC应用程序。 这是一个登录表单,因此唯一需要的验证是检查输入是否为非空。 现在,在我将其传递给模型之前,我会在控制器中验证它。 这是不是最佳实践?它是否属于模型?它的业务逻辑,因此不,它不属于模型。在控制器中,您拥有ModelState属性,可以向其中添加验证错误 Business Logic -> Controller Data Validation -> Model 请参阅。假设您的应用程序的结构如下: 模型视图控制器 服务 坚持 模型 用户输

我有一个从表单接收输入的MVC应用程序。
这是一个登录表单,因此唯一需要的验证是检查输入是否为非空。
现在,在我将其传递给模型之前,我会在控制器中验证它。

这是不是最佳实践?它是否属于模型?

它的业务逻辑,因此不,它不属于模型。

在控制器中,您拥有ModelState属性,可以向其中添加验证错误

Business Logic  -> Controller
Data Validation -> Model

请参阅。

假设您的应用程序的结构如下:

  • 模型视图控制器
  • 服务
  • 坚持
  • 模型

用户输入将到达您的控制器,您将使用服务层中的服务对其进行验证

我认为没有官方的最佳实践将验证限制在MVC模式的任何单个部分。例如,您的视图可以(也应该)使用Javascript进行一些预先验证。控制器还应提供相同类型的验证,以及更多与业务逻辑相关的验证。该模型还可以提供验证形式,即设置器不允许空值


对此有一个有趣的讨论。

在尝试在控制器和模型中进行验证之后,我已经思考了很长时间。。。。最后我得出结论,对于我的许多申请。。。验证属于模型,而不属于控制器。为什么?因为同一个模型将来可以被其他各种控制器调用或API使用。。。然后我必须一遍又一遍地重复验证过程。这将违反DRY并导致许多错误。另外,从哲学上讲,它是一个与数据库(或其他持久性存储)交互的模型,因此是一个无论如何都可以做到这一点的“最后一次酒精调用”的地方


因此,我在控制器中执行get/post转换,然后将原始数据发送到模型进行验证和处理。当然,我经常做php/mysql web应用程序,如果你做其他事情,结果可能会有所不同。我希望这对某人有所帮助。

验证必须在模型中

只有模型知道业务的“细节”。只有模型知道哪些数据是可接受的,哪些数据不是。控制器只知道如何“使用”模型

Business Logic  -> Controller
Data Validation -> Model
例如:假设我们需要向系统注册新用户的功能

模型:

 public function registerUser(User $user){
    //pseudo code
       //primitive validation
       if(!isInt($user->age)){
           //log the invalid input error
           return "age"; 
       }
       if(!isString($user->name)){
           //log the invalid input error
           return "name";
       }
       //business logic validation

        //our buisnees only accept grown peoples
        if($user->age < 18){
            //log the error
            return "age";
        }
        //our buisness accepts only users with good physique
        if($user->weight > 100){
            //log the error
            return "weight";
        }
        //ervery thing is ok ? then insert the user
        //data base query (insert into user (,,,) valeues (?,?,?,?))
        return true;
}
类用户

class User { 
    public $age;
    public $name;
    public $weight;
}
拥有这样的体系结构将使控制器完全从业务逻辑的细节中“解放出来”——这是一件好事

假设我们想在网站的其他地方进行另一种形式的用户注册(我们将为其分配另一个控制器)。现在,另一个控制器将使用与模型
registerUser()
相同的方法


但是,如果我们在控制器和模型之间分配验证逻辑,它们将不会被分离——这是不好的,而且不利于MVC——这意味着每次需要创建新视图和控制器来注册新用户时,必须同时使用相同的旧控制器和模型。此外,如果更改了业务逻辑(我们现在接受体育俱乐部中的青少年),您只需更改model
registerUser()
函数中的代码即可。控制器代码仍然是一样的。

上面的答案说这是业务逻辑,所以它不属于模型。你是说它是对的?我很困惑。请详细解释你为什么这么认为,我不同意。我会说:业务逻辑->域;用户界面逻辑->控制器;Validation->Domain+UI(可选)@the_drow:我是说业务逻辑不属于模型,而是属于控制器。@Martinho:@unknown和@Kaleb似乎同意我的观点。让我澄清一下:所谓域,我指的是所谓的域模型、域层或有时是业务逻辑层()。UI是用户界面。MVC是一种用户界面体系结构()。我上面说的是,业务逻辑不属于用户界面,而是属于域层。验证应该在域层中,但也可以在其他层中使用,比如UI(可能在控制器或Js中的视图中),以向用户提供快速反馈。下面的答案则相反。请详细说明并解释你为什么这么认为。我可能会走达伦下面概述的路线。在这种情况下,它将进入您的服务层。基本上是这样想的,;不允许空字符串是模型对您施加的约束吗?这不是一个UI问题。因此,这一定是一个商业问题;用户无法使用空用户名登录。Uh。如果您正确执行MVC,那么业务逻辑属于模型,而不是视图或控制器。应用程序逻辑属于控制器,视图就是视图。可以说,验证不是业务逻辑,而是应用程序逻辑,但这有点像分裂头发?什么是服务层?没有数据库,因此本身就没有持久性,所有数据都是从另一个进程获取的,所有数据都是从UI或进程中更改的?除非这是一个老式的Web 1.0风格的Web应用程序或框架。有,但我不会触摸/编码/处理它,除非我真的想:)在这个框架中,视图只创建和初始化小部件,并将它们附加到根小部件。不过,它可以包含验证功能。因此,视图是验证数据是否非空的地方,而模型是验证输入的用户名和密码是否正确的地方?视图是否也应该调用模型功能?这样一来,他们就失去了全部意义。控制器现在正在做的是:验证非空值并将其传递给模型。我应该让视图调用该控制器吗