在php中路由url的更好方法


Better way for routing URLs in php

我没有使用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