【问题标题】:How to organize your Controllers to get the best structure (MVC)如何组织控制器以获得最佳结构 (MVC)
【发布时间】:2010-12-31 11:18:39
【问题描述】:

组织控制器的最佳方式是什么。假设我有一个用户控制器和一个注册操作,我应该有一个 process_registration 操作以及我验证和处理数据的地方,还是只在注册操作本身内进行所有处理。我是否应该为每个需要它的操作(注册、process_registration.. 等)提供验证/处理操作

我还注意到,很多人都有专门用于验证和处理信息的模块和控制器,(我想可能是将所有验证逻辑和规则保存在一个地方?)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    就“注册”和“进程注册”这两个动作而言,我发现只有一个动作更简洁,它对发布和获取请求的响应不同。我将此操作称为“创建”以保持 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);
      }
    }
    
    ?>
    

    【讨论】:

    • 非常感谢,如果您能在此示例中进一步解释您的模型的外观,那就太好了。谢谢
    【解决方案2】:

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

    来自“Zend Framework: Surviving The Deep End”的This section 可能是一本不错的读物。

    【讨论】:

      【解决方案3】:

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

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

      如果您只打算拥有一个静态注册页面,您不想费心将注册处理和注册页面分开。这样,您可以检查并查看您是否正在接收表单数据,并在一个操作中完成表单显示和处理。

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多