【发布时间】:2013-02-14 20:16:51
【问题描述】:
我正在使用 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 查询,这真的很恶心.
我已经用基本(但有用的)PHP 代码示例搜索了关于 MVC 工作原理的良好资源,并且我一直在努力寻找特别有用的东西。我应该避免将我的 URL 结构映射到操作,而是选择放置一个名为“操作”的 POST 字段吗?我应该以某种方式构建一个系统,通过 SESSION 数据中的数组传递这些数据吗?
有什么建议吗?
注意:我只想说明我知道这个问题不适合 SO 文化,因为它可能没有正确/错误的答案,但我发现 SO 总是拥有最好/最博学的用户-根据。如果有人对我应该在哪里提出这些问题有提示,我将非常感激,所以我不会添加混乱!
【问题讨论】:
-
为什么你的控制器知道数据库连接?为什么它只有一种方法?
iController的版权归苹果所有吗? -
如果你的方法中有一个switch,你需要几个方法。
-
我会联系我的专利代理人以确保:-P。糟糕,我无法在这些 cmets 中添加新行。我只是将数据库连接向下传递,因此在访问模型时不必创建新连接。我在我的 index.php/bootloader 文件中创建了数据库,然后将它传递给控制器,控制器不断地向下流。
-
我很感激人们对问题投赞成票/投反对票,但对于投反对票的人,如果你至少让我知道我可以从哪里获得关于这些类型问题的建议,我将不胜感激。我一个人工作,所以我没有被我所在领域的同行包围,所以我转向 SO。
-
请在 youtube 上查找“干净的代码讨论”,然后阅读 M.Folwer 关于 MVC 和一般设计模式主题的内容。