我没有使用MVC结构,因为我发现它很难处理。所以,在我所有的网络项目,我使用一步一步直接的方式。(我不知道确切的词,但结构使用的WordPress。即逐个加载文件。)
我使用.htaccess
重定向所有URL请求到index.php
文件,并从中获取URL查询。然后使用该查询加载相应的页面。
站点的index.php
文件
// load all configuration files, function files here.
$query = ( isset ($_GET['q']) ) ? $_GET['q'] : "index";
if ( !userLoggedIn() ) {
if ($query == "index") {
include_once ("pages/index.php");
} elseif ($query == "signup") {
include_once ("pages/signup.php");
} else {
include_once ("pages/404.php");
}
} else {
if (in_array($query, get_list_of_usernames())) {
include_once ("pages/users.php");
} elseif () {
// and so on...
} else {
include_once ("pages/404.php");
}
}
现在,我的问题,
- 我做正确的URL路由吗?或者有其他更有效的方法来做到这一点?
- 这种结构优于MVC,还是MVC优于此?
路由只是MVC的一部分,是控制器部分的一部分。从理论上讲,MVC模式可以被视为与您希望的路由方式不同的东西。MVC更多的是关于你如何构建你的代码。
我曾经为一个自制的路由方法做过类似的事情。这取决于控制器类是否有动作方法。
您需要有一个名为Controller
的基类,并且您的所有控制器类都需要扩展它。所以基础控制器是class Controller {}
,任何控制器都可以是class someController extends Controller { function someAction() {} }
……调用该方法将使用http://mysite/someController/someAction
index . php:
// include callable controllers here
$partsA = explode("?", $_SERVER['REQUEST_URI']); // split querystring
$partsB = explode("/", $partsA[0]); // get url parts
if (count($partsB) < 2)
die("missing controller in url");
elseif (count($partsB) < 3)
die("missing action in url");
$className = $partsB[1];
$methodName = $partsB[2];
if (class_exists($className))
if (!is_subclass_of($className, "controller"))
die(htmlspecialchars("Class $className doesn't extend controller")); // prevents use of unauthorized classes
else
$controller = new $className();
else
die(htmlspecialchars("Class $className doesn't exist"));
if (!method_exists($controller, $methodName))
die(htmlspecialchars("Method $methodName doesn't exist"));
else
$controller->$methodName();
controller .php: (base controller)
class Controller {}
现在任意控制器....如SomeController.php:
class someController extends Controller {
function someAction() {
echo "test";
}
}
…调用someAction()
方法将通过http://mysite/someController/someAction
完成,显示test