【问题标题】:MVC - functionality in the controller/modelMVC - 控制器/模型中的功能
【发布时间】:2011-04-10 13:52:16
【问题描述】:

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

在使用 Google 时,我发现了 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']);

知道添加用户可能在多个地方完成并且我不希望代码重复,我将创建一个用户模型。此类将包含一个方法 addUser()。我有点坚持的是验证。 UserValidator 会检查所有字段是否填写正确。

我可以这样做:

$validator = new UserValidator();

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

但我也可以这样做:

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

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

在获取某个用户的信息时也会出现同样的问题。不是每个人都能得到这些信息,所以我的代码可能如下所示:

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

(hasAccess()-方法会检查登录的用户是否可以查看某个用户id的详细信息)

但我也可以调用 getUserById() 并检查您是否有权访问该方法。哪个选项最好?

谢谢!

【问题讨论】:

    标签: php oop model-view-controller design-patterns


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我对第二个例子做了一些改进。
    • 如果hasAccess() 仅用于调用getUserById() 的上下文中,那么可能没有理由将其分开。否则,请尽可能保持逻辑单元离散,尤其是在类中。
    • 不是。在编辑用户、删除用户等时,还需要检查您是否有权访问该特定用户。
    • getUserById() 中调用hasAccess() 是处理控制器的更简洁的方式,IMO。控制器中太多的 if 语句让我考虑重构。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-11
      • 2017-11-25
      • 2016-11-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多