uk/routing

小型UniKado URL路由库。

0.1.3 2016-07-28 14:43 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:58:47 UTC


README

简单的URL路由库。

安装

通过composer安装它!

composer require uk/routing

或者在你的composer.json中包含它

{
   "require": {
      "php": ">=7.0",
      "uk/routing": "^0.1.3"
   }
}

准备Web服务器

对于Router的使用,你需要告诉Web服务器,它应该将请求重写到不存在的URL路径到处理PHP脚本。

你可以通过两种不同的方式来做这件事

  • 将不存在的URL路径作为具有特定名称的GET变量传递到脚本中
  • 通过$_SERVER[ 'REQUEST_URI' ]传递不存在的URL路径(最佳选择)

Apache Web服务器

对于Apache来说,处理重写非常简单。

创建一个名为.htaccess的文件,并将其放置在需要重写工作的文件夹中。

但请注意!

.htaccess(分布式配置文件)应仅在没有访问服务器配置文件的情况下使用。

.htaccess的使用会带来一些开销,可以避免。

但如果您承认一个服务器,就没有必要再向您展示更多了。您必须知道它 :-)

此文件的内容取决于应使用的路由器类型。

作为GET变量(RouterType::REWRITE_TO_GET)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?theURL=$1 [QSA,L]

第一行启用重写引擎。第二行声明匹配所有不存在的文件调用条件,第三行匹配所有不存在的目录调用。

最后一行将匹配的调用重写到不存在的文件和目录到index.php,并将调用的不存在的URL路径传递到theURL GET变量

作为'REQUEST_URI'值(RouterType::REWRITE_TO_REQUEST_URI)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

第一行启用重写引擎。第二行声明匹配所有不存在的文件调用条件,第三行匹配所有不存在的目录调用。

最后一行将匹配的调用重写到不存在的文件和目录到index.php,并将调用的不存在的URL路径传递到$_SERVER[ 'REQUEST_URI' ]

错误处理

如果.htaccess的使用引发了某些服务器错误(例如,错误50*或其他),你必须检查

  • Apache是否启用了使用.htaccess文件
  • Apache是否启用了通过.htaccess文件进行重写(.htaccess文件的权限)
  • Apache是否启用了mod_rewrite扩展

前两个可以通过确保AllowOverwrite指令来处理。有关详细信息,请参阅:Apache HTTP服务器教程:.htaccess文件

AllowOverride FileInfo

要检查是否启用了mod rewrite,请在您的控制台中调用此命令

sudo a2enmod rewrite

如果已经启用,它将输出:Module rewrite already enabled

如果没有启用,则启用重写模块。

如果您无法访问服务器上的控制台,请联系管理员或提供商,并询问是否已为您启用mod_rewrite。如果没有,请让他们通过.htaccess启用mod_rewrite的使用

NGINX Web服务器

这是一个大的TODO!:-)

但我想如果你使用

try_files $uri $uri/ /index.php?$args;

……它应该可以通过$_SERVER[ 'REQUEST_URI' ]index.php中获取到调用URL路径

使用方法

// Include the autoloader, created by composer
require __DIR__ . '/vendor/autoload.php';

use UK\Routing\Router;
use UK\Routing\RouterType;

// Init the router
$router = new Router(
   // The type of the router
   RouterType::REWRITE_TO_REQUEST_URI
);

// Adds an dynamic regex URI path route
$router->addRoute(
   '~^/foo/(\d+)/bar/?$~',
   function ( array $matches )
   {
      // If you need access to current Router instance can get it by Router::GetInstance()
      echo 'ID: ', $matches[ 1 ], ' OK :-)';
      exit;
   }
);

// Adds an static URI path route
$router->addRoute(
   '~^/baz/?$~',
   function ()
   {
      // If you need access to current Router instance can get it by Router::GetInstance()
      echo 'The BAZ is called!';
      exit;
   }
);

在定义你的路由后,你只需调用execute(),然后路由就会被执行。

if ( ! $router->execute() )
{
   // Showing 404 error because no router matches the defined request URI path.
}