【问题标题】:How to fix this router class to include 404 errors/pages?如何修复此路由器类以包含 404 错误/页面?
【发布时间】:2015-05-13 12:02:13
【问题描述】:

我正在开发一个用于 php 练习的简单路由器,它已经发展了很多,但我发布了更简单的版本。

我的路由器类检查给定的 url 与当前服务器路径,如果匹配则返回内容。这很好用,但问题是路由器运行了 3 次,因为我在 routes.php 文件中调用了路由器 get() 方法 3 次。

例如,如果我想在路由不匹配时返回 404 错误,它将返回 3 次。每条路线未找到 1 次。解决此问题的最佳方法是什么?

非常感谢您的帮助。

路由器类:

<?php
class Router {
    public $currentRoute = '/';
    public function __construct()
    {
        $this->getCurrentRoute();
    }
    public function getCurrentRoute()
    {
        if(isset($_SERVER['PATH_INFO'])) {
            $this->currentRoute = $_SERVER['PATH_INFO'];
        }
    }
    public function get($route, $content)
    {
        if($route == $this->currentRoute) {
            echo $content();
        }
    }
}

路线文件:

<?php

$router->get('/', function()
{
    return 'Index page';
});

$router->get('movies', function()
{
    return Cinematix\View::make('movies');
});

$router->get('users', function() 
{
    return 'The users collection page';
});

【问题讨论】:

  • 我想这必须在很大程度上重写以在不同的问题上实现这一点,因为没有人回答我会尝试用可能的解决方案来更新它,有人可以帮助我解决。
  • 我会用包含路由的路由器重写它。因此,您将添加路由而不是 get,然后在路由器内的一个循环中检查所有路由。我相信流行框架中的大多数路由器都是这样制作的。

标签: php oop url routing pathinfo


【解决方案1】:

首先请注意,您的方法不推荐。查找经典的MVC programming pattern 是一个很好的开始。

如果您真的想按照开始使用匿名回调的方式进行操作,请继续阅读。

路由器类:

class Router {
    public $currentRoute = '/';
    private $routes;

    public function __construct($routes)
    {
        $this->routes = $routes;
        $this->getCurrentRoute();
    }
    public function getCurrentRoute()
    {
        if(isset($_SERVER['PATH_INFO'])) {
            $this->currentRoute = $_SERVER['PATH_INFO'];
        }
    }
    public function route()
    {
        $route = $this->currentRoute;

        if (!isset($this->routes[$route])) {
            $route = '/404';
        }

        if (is_callable($this->routes[$route])) 
        {
            echo $this->routes[$route]();  
        }    
    }
}

路由文件:

$routes = array(
    '/' => function()
    {
        return 'Index page';
    },
    '/movies' => function()
    {
        return 'Movies';
    },
    '/users' => function() 
    {
        return 'The users collection page';
    },
    '/404' => function() 
    {
        return '404';
    }
);

$router = new Router($routes);
$router->route();

【讨论】:

    【解决方案2】:

    一个简单的解决方案可能是在你的类中声明一个静态标志。说

    <?php
    class Router {
        static $found = 0;
        public $currentRoute = '/';
    

    然后,在 routes.php 中你可以这样:

    $router->get('/', function()
    {
        Router::$found = 1;
        return 'Index page';
    });
    
    $router->get('movies', function()
    {
        Router::$found = 1;
        return Cinematix\View::make('movies');
    });
    
    $router->get('users', function() 
    {
        Router::$found = 1;
        return 'The users collection page';
    });
    
    if (!Router::$found) {
        $router->get('404', function()
        {
            return '404 page';
        });
    }
    

    现在,“404”必须是路由器类中声明的“路径”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2016-10-20
      相关资源
      最近更新 更多