itlessons / php-routing
PHP 路由库
0.0.1
2015-01-17 10:22 UTC
Requires
- php: >=5.3.3
This package is not auto-updated.
Last update: 2024-09-24 02:27:21 UTC
README
路由将请求与将请求转换为响应的代码相关联。
以下示例演示了如何设置一个完整的路由系统
use Routing\Router;
$host = 'http://domain.tld';
$router = new Router($host);
$router->add('home', '/', 'controller:action');
$router->add('hello', '/hello', 'static:welcome', 'GET');
$router->add('profile', '/user(id:num)', 'profile:index', 'GET|POST');
$route = $router->match('GET', '/user777');
// $route->getController() => 'static:welcome'
// $route->getParameters() => [id:777]
$url = $router->generate('profile', array('id' => 777));
// $url => /user777
$url = $router->generate('profile', array('id' => 777), true);
// $url => http://domain.tld/user777
仅 URL 匹配
您可以独立使用 URL 匹配器
use Routing\UrlMatcher;
$matcher = new UrlMatcher();
$matcher->register('GET', '/', 'controller:action');
$matcher->register('GET', '/hello', 'static:welcome');
$matcher->register('GET|POST', '/user(id:num)', 'profile:index');
$route = $router->match('GET', '/hello');
仅 URL 生成
您可以独立使用 URL 生成器
use Routing\UrlGenerator;
$generator = new UrlGenerator('http://domain.tld');
$generator->add('home', '/');
$generator->add('hello', '/hello');
$generator->add('profile', '/user(:id)');
$url = $generator->generate('profile', array('id' => 888), true);
可选的最后占位符
您可以在模式的末尾指定可选的占位符
use Routing\Router;
$host = 'http://domain.tld';
$router = new Router($host);
$router->add('blog', '/blog/(page:num:?)', 'controller:action');
// match
$route = $router->match('GET', '/blog');
$route = $router->match('GET', '/blog/1');
// generate
$router->generate('blog'); => /blog
$router->generate('blog', array('page' => 1)); => /blog/1
类似路由
您可以在类似路由上使用重定向(例如 /blog -> /blog/ 如果 /blog/ 存在)
use Routing\Router;
$host = 'http://domain.tld';
$router = new Router($host);
$router->add('home', '/', 'controller:action');
$router->add('hello', '/hello', 'static:welcome');
$router->add('profile', '/blog/', 'profile:index');
$route = $router->match('GET', '/hello/');
if($router->getMatcher()->isNeedRedirect()){
// need redirect to /hello
redirect($router->getMatcher()->getRedirectUrl(), 302);
}
$route = $router->match('GET', '/blog');
if($router->getMatcher()->isNeedRedirect()){
// need redirect to /blog/
redirect($router->getMatcher()->getRedirectUrl(), 302);
}
缓存编译数据
您可以将编译规则缓存到文件中以提高性能
use Routing\Router;
use Routing\Request;
$request = new Request();
$router = new Router($request->getHTTPHost());
$router->useCache(__DIR__.'/matcher.cache.php', __DIR__.'/generator.cache.php');
$router->add('home', '/', 'controller:action');
// ...
$route = $router->match($request->getMethod(), $request->getPathInfo());
请求类助手
您可以使用简单的请求类来查找 pathInfo
use Routing\Router;
use Routing\Request;
$request = new Request();
$router = new Router($request->getHTTPHost());
$router->add('home', '/', 'controller:action');
$router->add('hello', '/hello', 'static:welcome', 'GET');
$router->add('profile', '/user(id:num)', 'profile:index', 'GET|POST');
$route = $router->match($request->getMethod(), $request->getPathInfo());
资源
您可以使用以下命令运行单元测试
$ cd path/to/php-routing/
$ composer.phar install
$ phpunit