如何修复此路由器 class 以包含 404 errors/pages?
How to fix this router class to include 404 errors/pages?
我正在为 php 练习开发一个简单的路由器,它已经发展了很多,但我发布的是更简单的版本。
我的路由器 class 检查给定的 url 与当前服务器路径和 return 的内容是否匹配。这工作正常,但问题是路由器运行了 3 次,因为我在我的 routes.php 文件中调用了路由器 get() 方法 3 次。
例如,如果我想在路由不匹配时 return 一个 404 错误,它将 return 它 3 次。每条路线 1 次未找到。解决此问题的最佳方法是什么?
一如既往,非常感谢您的帮助。
路由器class:
<?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';
});
一个简单的解决方案可能是在 class 中声明一个静态标志。说
<?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”必须在路由器 class 中声明 'path'。
首先请注意,您的方法不推荐。查找 classic MVC programming pattern 是一个很好的开始方式。
如果您真的想按照开始使用匿名回调的方式进行操作,请继续阅读。
路由器class:
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();
我正在为 php 练习开发一个简单的路由器,它已经发展了很多,但我发布的是更简单的版本。
我的路由器 class 检查给定的 url 与当前服务器路径和 return 的内容是否匹配。这工作正常,但问题是路由器运行了 3 次,因为我在我的 routes.php 文件中调用了路由器 get() 方法 3 次。
例如,如果我想在路由不匹配时 return 一个 404 错误,它将 return 它 3 次。每条路线 1 次未找到。解决此问题的最佳方法是什么?
一如既往,非常感谢您的帮助。
路由器class:
<?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';
});
一个简单的解决方案可能是在 class 中声明一个静态标志。说
<?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”必须在路由器 class 中声明 'path'。
首先请注意,您的方法不推荐。查找 classic MVC programming pattern 是一个很好的开始方式。
如果您真的想按照开始使用匿名回调的方式进行操作,请继续阅读。
路由器class:
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();