我正在使用MVC架构开发一个基本的Web应用程序。我正在建立自己的尝试,以充分了解MVC拱的工作方式,因此这也是一个学习练习。
我正在使用Aura Router类将我的URL映射到控制器和操作,以便像mysite.com/login这样的东西将映射到LoginController,如果我将表单提交到mysite.com/login/login,它将映射它到LoginController-> doAction('login')。
控制器示例如下所示:
class LoginController implements iController {
public function doAction( PDO $dbh, $action ) {
switch( $action ) {
case 'login':
//login here
$user = new User();
$user_id = FALSE;
if( $user_id = $user->login( $_POST['email'], $_POST['password'] ) ) {
//save user id to session
}
else {
$results = array( 'errors' => array( 'invalid' ) );
MembershipFunc::redirect( '/login', $results );
}
break;
case 'logout':
//logout
break;
default:
break;
}
}
}
我面临的问题是,为了避免人们刷新页面并重新提交数据,我希望在登录失败时将用户转发回登录页面。目前,如果我不转发它们,那么它们将显示在页面mysite.com/login/login上,我认为它不是特别干净。我的简单登录表格没问题,因为错误可能会重定向到mysite.com/login?error=email,password&email=user@domain.com但是如果形式庞大,我会得到一个巨大的URL查询,真的很糟糕。
我已经搜索了有关MVC如何工作的基本(但有用)PHP代码示例的良好资源,并且我一直在努力寻找特别有用的东西。我应该避免将我的URL结构映射到一个操作,而是选择放置一个名为“action”的POST字段吗?我应该以某种方式构建一个系统,我通过SESSION数据中的数组传递这些数据吗?
有什么建议吗?
注意:我只想说明我知道这个问题不符合SO文化,因为它可能没有正确/错误的答案,但我发现SO总是拥有最好/最知识渊博的用户 - 基础。如果有人有关于我应该指导这些问题的提示,我会非常感激,所以我不会添加杂乱!
答案 0 :(得分:1)
在我的MVC网址中看起来像: ?的index.php C =控制器与放大器; M =&ControllerMethod放大器; d = / sepparated /列表/的斜线/东西
数据(d =)在斜杠上展开,并作为数组传递给每个控制器方法。 自动加载(通过spl_autoload_register())用于调用类(c =),然后调用该类中的方法(m =)。
此外,听起来您要么没有在表单上设置ACTION,要么故意将ACTION设置为GET。作为一般规则,ACTION应该是POST以保持URL健全。搜索表单除外。那些可以具有各种优势的GET。
重定向以防止刷新时重新提交的表单是您的最佳选择(可能只是选项)。但在我的MVC index.php?c = user& m = login处理登录页面和登录操作。
示例强>
class login extends Controller {
public function login($data) {
if(empty($_POST)) {
$this->view = "login.tpl";
return TRUE;
}
$res = $this->model->auth();
if($res !== TRUE) {
$_POST = NULL;
$this->errorState = 1;
$this->errorMsg = "Invalid login details";
$this->login();
return FALSE;
}
Core::setMessage('success', 'user', 'login', '2', 'Logged in successfully');
$home = new home(); //whatever the main controller is
$home->index($data);
//alternatively you can redirect
header("Location: index.php?c=home&m=index);
return TRUE;
}
}
这是否有意义或者我完全错过了标记?