0

我没有使用 MVC 结构,因为我发现它很难处理。所以,在我所有的网络项目中,我都是一步一步直接使用的。(我不知道确切的词,但是 WordPress 使用的结构。即一个一个地加载文件。)

我将所有 URL 请求重定向到index.php文件 Using .htaccess,并从中获取 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 比这更好?
4

1 回答 1

1

路由只是 MVC 的一部分,是控制器部分的一部分。MVC 模式理论上可以被视为与您想要的路由方式不同的东西。MVC 更多的是关于如何构建代码。

我曾经为路由的自制方法做过类似的事情。这取决于具有操作方法的控制器类。

您需要调用一个基类Controller,并且所有控制器类都需要扩展它。所以基本控制器会是class Controller {},任何控制器都可能像class someController extends Controller { function someAction() {} }......调用该方法将是http://mysite/someController/someAction

索引.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:(基本控制器)

class Controller {}

现在任何控制器.... 例如 SomeController.php:

class someController extends Controller {
    function someAction() {
        echo "test";
    }
}

...调用该someAction()方法将完成http://mysite/someController/someAction,向您展示test

于 2013-04-17T12:37:03.027 回答