0

我正在使用 MVC 架构开发一个基本的 Web 应用程序。我正在构建自己的尝试并完全理解 MVC 架构的工作原理,因此这可以兼作学习练习。

我正在使用 Aura Router 类将我的 URL 映射到控制器和操作,以便将 mysite.com/login 之类的内容映射到 LoginController,如果我向 mysite.com/login/login 提交表单,它将映射到 LoginController- >doAction('登录')。

控制器示例如下所示:

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 总是拥有最好/最博学的用户群。如果有人对我应该在哪里提出这些问题有提示,我将非常感激,所以我不会添加混乱!

4

1 回答 1

1

在我的 MVC URL 中看起来像: index.php?c=Controller&m=ControllerMethod&d=slash/sepparated/list/of/stuff

数据 (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;

    }

}

这有意义还是我完全错过了标记?

于 2013-02-14T20:38:53.400 回答