所有
我正在研究我的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
}
}
?>
答案 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/something
或include
次调用。
require