Php 提交表单后,从控制器向视图发送数据的最佳方式?

Php 提交表单后,从控制器向视图发送数据的最佳方式?,php,model-view-controller,Php,Model View Controller,我正在使用MVC架构开发一个基本的web应用程序。我正在构建自己的模型,以尝试并充分理解MVC arch是如何工作的,因此这同时也是一个学习练习 我正在使用Aura Router类将我的URL映射到控制器和操作,以便像mysite.com/login这样的东西将映射到LoginController,如果我将表单提交到mysite.com/login/login,它将映射到LoginController->doAction('login') 控制器示例如下所示: class LoginContro

我正在使用MVC架构开发一个基本的web应用程序。我正在构建自己的模型,以尝试并充分理解MVC arch是如何工作的,因此这同时也是一个学习练习

我正在使用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=电子邮件、密码和电子邮件=user@domain.com但是如果是一个巨大的表单,我会得到一个巨大的URL查询,这真的很糟糕

我已经用基本的(但有用的)PHP代码示例搜寻了关于MVC如何工作的好资源,我一直在努力寻找任何特别有用的东西。我是否应该避免将我的URL结构映射到一个操作,而是选择放置一个名为“action”的POST字段?我是否应该构建一个系统,通过会话数据中的数组传递这些数据

有什么建议吗

注意:我只想说明我知道这个问题不适合SO文化,因为它可能没有正确/错误的答案,但我发现SO总是拥有最好/最有知识的用户群。如果有人对我应该把这些问题带到哪里有建议的话,我会非常感激,这样我就不会添麻烦了

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

数据(d=)在斜杠上分解,并作为数组传递给每个控制器方法。 自动加载(通过spl_autoload_register())用于调用类(c=),然后调用该类中的方法(m=)

而且,听起来你要么没有在表单上设置动作,要么故意设置动作来获取。作为一般规则,应该发布操作以保持URL正常。搜索表格除外。这些可以通过各种优势得到

重新定向以防止刷新时重新提交表单是最好的选择(可能是唯一的选择)。但是在我的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;

    }

}

这有意义吗?或者我完全没有注意到吗?

为什么您的控制器知道DB连接?为什么只有一种方法?
iController
是否受苹果版权保护?如果你的方法中有一个开关,你需要几种方法。我会联系我的专利代理人以确保:-P.哎呀,我不能在这些评论中添加新行。我只是向下传递DB连接,所以在访问模型时不必创建新连接。我在index.php/bootloader文件中创建DB,然后将其传递给控制器,控制器会不断向下传递。我很感激人们对这些问题进行上/下投票,但对于下投票人,如果您至少能让我知道我在哪里可以获得关于这些问题的建议,我将不胜感激。我独自工作,所以我没有被我所在领域的同行包围,因此我选择了这样做。请在youtube上查找“干净的代码对话”,然后阅读m.Folwer关于MVC和总体设计模式的内容。因此,您建议通过我表单中的隐藏字段设置操作。现在,如果您重定向用户并丢失post数据,那么您的Core::setMessage()函数如何将信息发送到视图?我的MVC框架不是为处理这种情况而设计的。如果我有或想要,我会将全局$PAGE变量存储在$\u SESSION或$\u COOKIE或其他东西(可能是$\u SESSION)中,并在页面登陆时使用它。在我的设置中,我们使用Smarty作为模板引擎,并使用Pines通知消息/错误。我们只为smarty分配了两个变量,$PAGE as PAGE和$this->view as TPL,后者加载内部模板和由Core:setMessage()设置的所有消息;以及$this->errorState和$this->errorMessage中的消息存储在$PAGE['messages']中。我们也不会为成功登录设置消息。很明显,当你看到登录页时,这是一个成功。我不能“到处评论”,所以我将把它放在这里:使用全局数据库处理程序。ie全球$db;然后,您可以在任何地方使用它,只要您希望它具有作用域并使用它,就可以重新定义global$db。