我已经看到代码编写,几乎所有非路由相关的代码都传递给模型.我还看到了代码,其中所有数据库持久性都由模型处理,但非DB处理由控制器处理.
哪种方法更好?
我有一个MVC应用程序从表单接收输入.
这是一个登录表单,因此唯一需要的验证是检查输入是否为非空.
在我将它传递给模型之前,我在控制器中验证它.
这是最佳做法吗?它属于模型吗?
我一直在学习模型 - 视图 - 控制器范例("MVC"),但我很困惑,因为一些教程与其他教程相矛盾.
我目前对这个过程的理解看起来像这样:
这是从某些存储源(如数据库或XML文件)收集原始数据的位置.该模型用作抽象层,将Controller对特定数据的请求转换为(例如)SQL查询,并将查询结果转换为标准格式(如数据对象).
例如,在上面描述的/ browse/all场景中:
这是该应用程序的真正主力.除了在模型和视图中来回传递消息之外,Controller还负责授权等事务和应用程序/"业务"逻辑编辑:每个答案,业务逻辑属于模型.
在正在进行的示例中,Controller将负责:
例如
<html>
<head>
<title>
<?php $question->getTitle() ?>
</title>
</head> …Run Code Online (Sandbox Code Playgroud) 在编码传统的MVC应用程序时,编写服务器端表单验证的最佳实践是什么?代码是属于控制器还是模型层?为什么?
而不是使用完整的PHP MVC,我正在设计一个最适合我的用途.我已经完成了基本框架,并编写了运行我的网站所需的模型和控制器.
现在我正在转向观点,我遇到了一个小困境.我的方法对我来说很好,但是为了将来的参考,我想知道我正在做的是一个坏习惯.
我正在做的事情:
在我的视图中,我正在调用运行我的身份验证系统的模型,并请求用户的登录状态.然后我使用该布尔值来决定是否在视图中显示某些元素,以及在何处放置其他元素.
我应该为每个登录状态设计单独的视图,还是这种方法很好?但是,如果我要将这个MVC应用到我正在为我的客户做的工作中,我需要使用最佳实践.
任何意见,将不胜感激!
使用MVC模式实现模型时,我的模型应该有多复杂?
假设我有几个这样的表:
我有一个名为UserController的控制器.该控制器应该允许我登录用户,创建用户等.
<!-- language: php -->
class UserController{
public function create($array){
...
}
public function login($email, $password){
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的模型应该非常原始,只通过ORM实现CRUD操作吗?这将导致代码如下:
<!-- language: php -->
class UserController{
public function create($array){
$userModel->username = 'blah';
$userModel->blah = 'blah';
$id = $userModel->save();
$emailModel->id = $id;
$emailModel->email = "emailhere";
$emailModel->save();
//Do the same for addresses
}
public function login($email, $password){
...
}
}
Run Code Online (Sandbox Code Playgroud)
或者,或者,我可以使用更复杂的模型:
<!-- language: php -->
UserModel{
public function login($email, $password){
//Do the joining and checking here, then …Run Code Online (Sandbox Code Playgroud) 我正在使用一个使用 MVC 范例的框架。它是 CodeIgniter,但我的问题并不是专门针对该框架 - 更普遍的是关于使用 MVC 时的最佳实践。
我使用 $_SESSION 变量来维护一些状态变量(用户选择、一些临时首选项、一些数据过滤选项)。这很容易做到,但我发现我在模型和控制器之间分割了这些变量的使用。有时我会更新控制器中的一个,并在模型中查找它。这开始“闻起来”很有趣,因为我突然想到让模型“意识到”所有这些设置可能不是一个好主意。模型不应该只接受获取/操作数据的请求,并且只关心请求中明确的内容(而不必查找外部变量)吗?
下面是一个示例: 我有一个名为 $_SESSION['regionFilter'] 的会话变量。这是在控制器中创建和更新的,代表用户想要“向下钻取”的销售区域。当控制器从模型请求一些数据时,我当前让模型查找 $_SESSION['regionFilter'] 变量,并在为数据库创建 SQL 时使用它。似乎让模型在程序状态方面变得“哑”,并且让控制器以某种方式将 $_SESSION['regionFilter'] 变量捆绑到其请求中(如果需要的话)可能更有意义。
有什么想法吗?谢谢!
编辑: 谢谢大家的讨论。我知道重叠的问题,但很难找到有关该主题的一般性讨论 - 我搜索“MVC 模型程序状态”时发现了许多有关 ASP.NET-MVC 特定讨论的问题,这些问题在实现中陷入困境细节。
我已将问题标记为已关闭。再次感谢您的想法!