在php中路由URL的更好方法

时间:2013-04-17 12:31:50

标签: php routing

我没有使用MVC结构,因为我觉得很难处理。所以,在我的所有网络项目中,我正在逐步使用。 (我不知道确切的单词,但是使用WordPress的结构。即逐个加载文件。)

我正在使用index.php将所有网址请求重定向到.htaccess文件,并从中获取网址查询。然后使用该查询我加载适当的页面。

网站的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");
     }
}

现在,我的问题,

  • 我是否正确使用网址路由?或者还有其他更有效的方法吗?
  • 这个结构是否比MVC好,或者MVC比这更好?

1 个答案:

答案 0 :(得分:1)

路由只是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 :(基本控制器)

class Controller {}

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

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

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