提交表单后,从控制器向视图发送数据的最佳方法是什么?

时间:2013-02-14 20:16:52

标签: php model-view-controller

我正在使用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总是拥有最好/最知识渊博的用户 - 基础。如果有人有关于我应该指导这些问题的提示,我会非常感激,所以我不会添加杂乱!

1 个答案:

答案 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;

    }

}

这是否有意义或者我完全错过了标记?