MVC——控制器/模型中的功能


MVC - functionality in the controller/model

我正在尝试使用OO设计来改进一些PHP脚本(它现在是带有一些OO部分的过程)。澄清一下,我并不是在尝试构建一个完整的MVC应用程序,而是在尝试尽可能地分离各个部分。我以前从未在PHP中使用过MVC(在Java中只使用过一点点)。

当使用谷歌时,我发现100种不同的PHP MVC方法,我找不到一本关于这个主题的好书。如果有人能给我推荐一本关于PHP中OO设计的好书,我将不胜感激。

目前,将用户添加到数据库的部分(假设用户现在只包含名字)看起来像这样(users.php):

$validator = new UserValidator();
if ($validator->validate($_POST['user_firstname']))
  $result = $db->execute("INSERT INTO `users` (`user_firstname`) VALUES (?)", $_POST['user_firstname']);

知道添加用户可能在多个地方完成,我不希望代码重复,我将创建一个usermodel。这个类将包含一个addUser()方法。我有点困惑的是验证。UserValidator将检查是否所有字段都被正确填写。

我可以这样做:

$validator = new UserValidator();
if ($validator->validate($_POST['user_firstname']))
  $result = $user->addUser($_POST['user_firstname']);

但是我也可以这样做:

$result = $user->adduser($_POST['user_firstname'];

现在,user -类将包含验证器,addUser()方法将执行此验证。假设上面的代码是控制器,那么哪个选项是最好的呢?将验证功能委托给模型还是在控制器中进行?

同样的问题也适用于获取某个用户的信息。不是每个人都能得到这个信息,所以我的代码看起来像这样:

if ($user->hasAccess($_SESSION['id'], $_GET['id'])
  $user->getUserById($_GET'id']);

(hasAccess()-方法将检查登录的用户是否可以查看特定用户id的详细信息)

但是我也可以调用getUserById()然后检查你是否在那个方法中有访问权。哪个选项是最好的?

谢谢!

在您的第一个示例中,将验证逻辑放在调用$result = $user->adduser($_POST['user_firstname'];中是更简洁的方法。让你的控制器保持苗条,让你的模型处理尽可能多的逻辑。理想情况下,你的控制器负责协调将传递给你的"视图"的数据,无论它是什么。

你的第二个例子不太清楚。您可能在hasAccess()中有不属于getUserById()的逻辑,或者您可能为getUserById()创建了比该方法有意义的更多的工作。尽可能保持相似的功能总是最好的,但是有一些假设不能仅仅通过查看您发布的两行来做出。

我经常使用CakePHP,这是一个PHP的MCV框架,在这种情况下,UserValidator将被分解成一个称为"组件"的单独实体。控制器将在保存之前调用组件进行验证,然后,如果所有验证都通过,则将数据发送到模型进行保存。

我认为创建一个单独的验证器类,可以检查控制器中的数据可能是可行的方法。