Web应用程序的路由

时间:2016-03-06 01:47:04

标签: php routing

我试图制作适用于Web应用程序的路由器,但是当我输入/用户时它与/ user /不同 源代码是Github - 140 Chars Router

任何人都可以解释并且可能会给我一个可以解释这个问题的简单代码吗?

1 个答案:

答案 0 :(得分:0)

该路由器只是一个概念证明,不应该在现实世界中使用。

  

它根本不是一个好的路由器,不要在真正的应用程序上使用它,它也不例外。我这样做只是为了好玩并展示简洁性

至于为什么它不起作用,是因为它将/user/user/视为两条不同的路线。您必须添加两个路由,以便路由器捕获它们:

function route_user() { echo 'User route'; }
$router->a('/user', 'route_user');
$router->a('/user/', 'route_user');

路由器非常基本。它只是添加路由,然后将其与当前路径进行匹配。它没有做任何其他事情。

这是路由器的扩展和注释版本:

class Router
{
    // Collection of routes
    public $routes = [];

    // Add a path and its callback to the
    // collection of routes
    function add($route, callable $callback) {
        $this->routes[$route] = $callback;
    }

    // Looks at the current path and if it finds
    // it in the collection of routes then runs
    // the associated function
    function execute() {

        // The server path
        $serverVariables = $_SERVER;
        $serverKey = 'PATH_INFO';

        // Use / as the default route
        $path = '/';

        // If the server path is set then use it
        if (isset($serverVariables[$serverKey])) {
            $path = $serverVariables[$serverKey];
        }
        // Call the route
        // If the route does not exist then it will
        // result in a fatal error
        $this->routes[$path]();
    }
}

稍微更实用的版本是这样的:

class Router {
    public $routes = [];
    function add($route, callable $callback) {

        // Remove trailing slashes
        $route = rtrim($route, '/');
        if ($route === '') {
            $route = '/';
        }
        $this->routes[$route] = $callback;
    }
    function execute() {
        // Only call the route if it exists and is valid
        $path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
        if (isset($this->routes[$path]) and is_callable($this->routes[$path])) {
            $this->routes[$path]();
        } else {
            die('Route not found');
        }
    }
}