2013-02-14 75 views
0

我正在开发一个使用MVC体系结构的基本web应用程序。我正在建立自己的尝试,并充分理解MVC拱门的工作方式,因此这可以用作学习练习。在提交表单后从控制器发送数据以查看数据的最佳方式?

我使用Aura路由器类将我的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 protected],但对于巨大的表单,我会得到一个巨大的URL查询,它是真的很糟糕。

我已经搜索了很多关于MVC如何工作的基本(但有用的)PHP代码示例,并且我一直在努力寻找特别有用的东西。我应该避免将我的URL结构映射到一个动作,而是选择放置一个名为“action”的POST字段来代替?我应该以某种方式建立一个系统,让我通过SESSION数据中的数据传递这些数据?

有什么建议吗?

注:我只想指出我知道这个问题不适合SO文化,因为它可能没有正确/错误的答案,但我发现SO总是拥有最好的/最有知识的用户群。如果任何人有关于我应该在哪些方面指导这些问题的提示,我会非常感激,所以我不会添加混乱!

+3

为什么您的控制器知道数据库连接?为什么它只有一种方法? iController是否受Apple的版权保护? – 2013-02-14 20:33:09

+0

如果您的方法中有*开关*,则需要多种方法。 – 2013-02-14 20:35:13

+0

我会联系我的专利代理人以确保:--P。糟糕,我无法在这些评论中添加新行。我只是传递数据库连接,所以我不必在去模型时创建一个新的连接。我在我的index.php/bootloader文件中创建了数据库,然后将它传递给控制器​​,并持续降低它的速度。 – Gazillion 2013-02-14 20:35:23

回答

1

以我MVC网址看起来像: 的index.php C =控制器&米= ControllerMethod & d =斜线/的/东西

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

此外,它听起来像是要么不在表单上设置ACTION,要么是故意将ACTION设置为GET。作为一般规则,ACTION应该是POST以保持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; 

    } 

} 

这是否有道理或有我完全错过了马克?

+0

所以你建议通过我的表单中的隐藏字段设置操作。现在,如果您重定向用户并丢失发布数据,Core :: setMessage()函数如何将信息发送到您的视图? – Gazillion 2013-02-14 20:42:56

+0

我的MVC框架不是为了处理这种情况而设计的。如果我有或想要将全局$ PAGE变量存储在$ _SESSION或$ _COOKIE或某物(可能是$ _SESSION)中并在页面着陆时使用它。在我的设置中,我们使用Smarty作为模板引擎,并使用Pines通知消息/错误。我们只将两个变量分配给smarty,$ PAGE作为PAGE,$ this-> view作为TPL加载内部模板以及由Core:setMessage()设置的所有消息。以及$ this-> errorState和$ this-> errorMessage中的一个存储在$ PAGE ['messages']中。 – DavidScherer 2013-02-14 20:51:19

+0

我们也不会设置成功登录的消息。很明显,当您看到目标网页时,它是成功的。 – DavidScherer 2013-02-14 20:53:46

相关问题