组织控制器的最佳方式是什么。假设我有一个用户控制器和一个注册操作,我是否应该有一个 process_registration 操作以及我验证和处理数据的地方,或者只是在注册操作本身内进行所有处理。我是否应该为每个需要它的操作(注册、process_registration 等)设置验证/处理操作?
我还注意到很多人都有专门用于验证和处理信息的模块和控制器,(我想可能会将所有验证逻辑和规则保存在一个地方?)
我想我的问题是,事物必须分开多远?这个问题也适用于模型和视图。
组织控制器的最佳方式是什么。假设我有一个用户控制器和一个注册操作,我是否应该有一个 process_registration 操作以及我验证和处理数据的地方,或者只是在注册操作本身内进行所有处理。我是否应该为每个需要它的操作(注册、process_registration 等)设置验证/处理操作?
我还注意到很多人都有专门用于验证和处理信息的模块和控制器,(我想可能会将所有验证逻辑和规则保存在一个地方?)
我想我的问题是,事物必须分开多远?这个问题也适用于模型和视图。
一般来说,您的验证应该在模型中进行;这就是 MVC 范式的重点。控制器逻辑是关于在动作之间来回切换用户,视图纯粹是为了展示,而业务逻辑位于模型中。
某些框架(CodeIgniter)通过制作没有附加逻辑(验证或其他)的模型平面对象与 MVC 的意图大相径庭,要求您将验证逻辑移动到控制器层,但此时您的“模型”不是t 真的是模型,但美化了数组。
至于有两个动作“注册”和“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);
}
}
?>
我的感觉是最好在模型中保留验证和“处理”。仅使用控制器来管理将请求映射到模型函数。
我想我可以根据您的问题给出的最佳建议是,您将希望在控制器中分解您的操作,以达到您希望模块化站点的程度。您还必须记住,如果您不断地从一个操作转移到另一个操作,那么处理和 SEO 都会产生成本,因为操作必须与唯一的 URL 相关联。
这是您希望将注册与注册操作分开的一个用例:您希望能够通过 AJAX 在站点的各个位置注册用户。通过转到注册页面和处理注册数据的不同操作,您很可能能够将这些操作重复用于注册页面以及任何页面上的注册灯箱或快速注册抽屉。
A case where you wouldn't want to bother splitting out registration processing and the registration page is if you're only planning on having a static registration page. That way, you can check and see if you're receiving form data and do both the form display and processing in one action.