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

BDu*_*elz 6 php model-view-controller code-organization

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

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

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

mea*_*gar 3

一般来说,您的验证应该在模型中进行;这就是 MVC 范式的要点。控制器逻辑是让用户在操作之间切换,视图纯粹用于表示,业务逻辑位于模型中。

某些框架 (CodeIgniter) 与 MVC 的意图大相径庭,它使模型成为没有附加逻辑(验证或其他)的平面对象,要求您将验证逻辑移至控制器层,但此时您的“模型”已不再适用。根本不是真正的模型,而是美化的数组。

至于有两个操作“register”和“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);
  }
}

?>
Run Code Online (Sandbox Code Playgroud)