如何组织控制器以获得最佳结构(MVC)

时间:2009-12-31 17:19:59

标签: php model-view-controller code-organization

组织控制器的最佳方式是什么。假设我有一个用户控制器和一个寄存器操作,我是否应该在我验证和处理数据的过程中执行process_registration操作,或者只是在寄存器操作本身内执行所有处理。我是否应对每个需要它的操作(注册,进程注册等)进行验证/处理操作

我还注意到很多人只有模块和控制器用于验证和处理信息,(我想将所有验证逻辑和规则保存在一个位置?)

我想我的问题是,事情需要分开多远?这个问题也适用于模型和视图。

3 个答案:

答案 0 :(得分:3)

通常,您的验证应该在模型中进行;这就是MVC范式的重点。控制器逻辑是关于在操作之间反弹用户,视图纯粹用于表示,业务逻辑位于模型中。

某些框架(CodeIgniter)与MVC的意图大相径庭,通过使模型平面对象没有附加逻辑(验证或其他),要求您将验证逻辑移动到控制器层,但此时您的“模型” “根本不是真正的模型,而是美化阵列。

就两个动作“注册”和“process_register”而言,我发现有一个动作更清晰,它对发布和获取请求的响应不同。我将这个动作称为“创建”以保持RESTful,并且在您的框架定义了将“/ register”映射到“/ user / create”的路由时定义了一个路径

示例伪php:

<?php

class User_controller {
  // [GET|POST] /users/create
  function create() {
    $user = new User();
    $error = '';

    if (postback) {
      // form has been submitted.
      $user->name = $_POST['name'];
      $user->password = $_POST['pasword'];

      if (validate_user($user)) {
        $user->save();
        redirect("user/show/$user->id");
      }
      // user save failed, fall through to displaying the new user form
      // the user's name and password (and other fields) are now populated,
      // and will display
      $error = 'Account creation failed.';
    }

    // Render the view with the user and the error message (if any)
    render('views/users/create', $user, $error);
  }
}

?>

答案 1 :(得分:1)

我的感觉是最好在模型中保持验证和“处理”。仅使用Controller来管理将请求映射到模型函数。

来自“Zend Framework:Surviving The Deep End”的

This section可能是一本很好的读物。

答案 2 :(得分:0)

我认为根据您的问题,我可以给出的最佳建议是,您希望在控制器中将您的操作分解到您希望模块化您的网站的程度。您还必须记住,如果您不断地从一个操作移动到另一个操作,那么处理和SEO都会有成本,因为操作必须与唯一的URL相关联。

这是一个用例,您希望将注册与注册操作分开: 您希望能够在整个站点的各个位置通过AJAX注册用户。通过不同的操作进入注册页面并处理注册数据,您很可能能够在任何页面上重复注册页面以及注册灯箱或快速注册抽屉的操作。

如果您只打算使用静态注册页面,那么您不想打扰拆分注册处理和注册页面的情况。这样,您可以检查并查看是否正在接收表单数据,并在一个操作中同时执行表单显示和处理。