组织控制器的最佳方式是什么?比方说,我有一个用户控制器和一个注册操作,我应该有一个process_registration操作,以及验证和处理数据的位置,或者只是在注册操作本身内执行所有操作。我是否需要验证/处理操作(注册,process_registration ..等)如何组织控制器以获得最佳结构(MVC)
我还注意到,很多人都有模块和控制器仅用于验证和处理信息,(我想保持所有的验证逻辑和规则在一个地方也许?)
我想我的问题是,有多大的距离,事情必须分开?这个问题也适用于模型和视图。
组织控制器的最佳方式是什么?比方说,我有一个用户控制器和一个注册操作,我应该有一个process_registration操作,以及验证和处理数据的位置,或者只是在注册操作本身内执行所有操作。我是否需要验证/处理操作(注册,process_registration ..等)如何组织控制器以获得最佳结构(MVC)
我还注意到,很多人都有模块和控制器仅用于验证和处理信息,(我想保持所有的验证逻辑和规则在一个地方也许?)
我想我的问题是,有多大的距离,事情必须分开?这个问题也适用于模型和视图。
通常您的验证应发生在模型中;这就是MVC范式的一个重点。控制器逻辑是关于在动作之间弹跳用户,视图纯粹用于演示,业务逻辑位于模型中。通过使模型没有附加逻辑(验证或其他方式)的平面对象,某些框架(CodeIgniter)与MVC的意图发生了很大的分歧,要求您将验证逻辑移动到控制器层,但在那时您的“模型“根本不是真正的模型,而是荣耀的阵列。
只要有两个动作“注册”和“process_register”,我发现它有一个动作更清晰,对发布和获取请求的响应方式不同。我把这种行为“创造”让一切平安,并有一个路由定义等。无论您的框架定义了它的路线图“/注册”到“/用户/创建”
例伪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);
}
}
?>
我的感觉是最好在模型中保持验证和“处理”。仅使用Controller来管理将请求映射到模型函数。 “Zend Framework:Surviving The Deep End”可能是一个不错的阅读。
我想根据您的问题,我可以给出的最好建议是,您希望将控制器内的动作分解为您希望模块化网站的程度。您还必须记住,如果您从一个操作不断移动到另一个操作,则处理和搜索引擎优化都会产生成本,因为操作必须与唯一的URL相关联。
以下是您希望将注册与注册操作分开的一种用例: 您希望能够通过AJAX在网站的各个位置注册用户。通过不同的操作进入注册页面并处理注册数据,您很可能可以在注册页面以及注册灯箱或任何页面上的快速注册抽屉中重复使用这些操作。
如果您只打算使用静态注册页面,您不想打扰注册处理和注册页面的麻烦。这样,您可以检查并查看您是否正在接收表单数据,并在一个操作中同时执行表单显示和处理。
非常感谢,如果你可以进一步解释你的模型在这个例子中的样子,这将是巨大的..谢谢 – BDuelz 2009-12-31 19:01:48