带有MVC的动态PHP网站 - 这是什么导航模式?

时间:2010-11-25 14:56:29

标签: php model-view-controller design-patterns

所有

我正在研究我的web dev类中给出的一些示例代码作为MVC的示例(同样,对于Web)。在此代码中,有一个系统可以从index.php页面导航到各种控制器(然后调用模型和视图模块),然后返回到index.php

我理解MVC是如何工作的。

我正在努力解决的是导航机制。我很难理解所有部分是如何协同工作的。

有没有人可以看看下面的代码并告诉我这是否与众所周知的方法/模式相匹配,以处理动态网站导航? (也许是前端控制器?)如果确实如此,那么我希望能够更容易地对它进行更多的研究。

非常感谢!

JDelage

的index.php

<?php
require_once("User.php");
session_start();

if (isset($_GET['action'])) 
  $action= $_GET['action'];
 else
   $action="";

switch ($action) {
 case 'login':
   require_once('Login.php');
   $command= new LoginControler();
   break;
 case 'logoff':
   require_once('Logoff.php');
   $command= new LogoffControler();
   break;
// Several other cases
 default:
   require_once('Unknown.php');
   $command= new UnknownControle();
}


$command->execute();
require_once('EntryMenu.php'); // Those are objects that represent both the 
// menu label and the links.
$menu= array(
         new EntryMenu("Login", "index.php", array("action" => "logon")),
         new EntryMenu("Logoff", "index.php", array("action" => "logoff")),
         new EntryMenu("Write", "index.php", array("action" => "write")),
         new EntryMenu("Read", "index.php", array("action" => "read"))
);

if ($command->redirect) {
  header('Location: ' . $command->redirect);
 } else if ($command->page) {

  include("ui/header.php");
  include("ui/menu.php");
  echo "<div class='content'>";
  include("ui/". $command->page);
  echo "</div>";
  include("ui/footer.php");
 }
?>

Controler.php

<?php
class Controler {
    public $page= "problem.php";
    function execute() {}
}
?>

LogoffControler.php

<?php
require_once('Controler.php');
class LogoffControler extends Controler {

  function execute() {
    $this->redirect= "index.php";
    unset($_SESSION['user']);
  } 
}
?>

LoginControler.php

<?php
 require_once('LoginModel.php'); // This manages the exchanges with the user db
 require_once('Controler.php');

 class ConnexionControle extends Controler {
  public $page= "LoginForm.php";

  function execute() {

  // More code to deal with incorrectly filled login forms

  $login = new LoginModel();
  $login->loginUser($_POST['login'], $_POST['password']);
  if ($login->userLogedIn()) {
    $_SESSION['user']= $login->user;
    $this->redirect= "index.php";
  }

// More code to deal with invalid logins

 } 
}
?>

2 个答案:

答案 0 :(得分:4)

我假设您了解控制器部分,并询问switch..case语句。我还没有找到官方名称,但大多数PHP的MVC框架(Kohana,CakePHP,CodeIgniter,Fat Free等)都称之为“路由”。它是URL到控制器的映射。

使用switch..case语句集是更简单的方法之一。更复杂的解决方案使用RegEx来匹配预定义的URL模式,以解析要调用的控制器,以及它的参数(通常捆绑为“请求”)

其他方法包括使用网址重写来提供漂亮的网址,例如/articles/month/nov/article-id/3

以'丑陋的网址形式'是:

action=articles&month=nov&article-id=3

答案 1 :(得分:1)

如果您想要一个易于理解的MVC系统版本,您可以尝试1kb PHP MVC以更清洁的方式处理您尝试的所有内容。虽然你可能不得不打破代码,如果你真的想以压缩形式阅读它。

使用此系统,您只需将控制器放在名为/classes/controller/的{​​{1}}中,然后您就可以通过somthing.php等网址访问它。

加载模型也很简单,不需要http://site.com/somethinginclude次调用。

require