jblond / php-router

一个简单的 PHP 路由类

v3.0.0 2023-12-05 13:58 UTC

This package is auto-updated.

Last update: 2024-09-05 15:31:25 UTC


README

Code Climate Codacy Badge SensioLabsInsight

一个简单的 PHP 路由类

代码行数少于300行,包含注释

支持

  • lambda URL
    • :any 任何符号
    • :num 只能是数字
    • :all 所有字符
    • :an A-Z a-z 0-9
    • :url A-Z a-z 0-9 - _
    • :hex 十六进制
  • 正则表达式 URL,例如 /user/(.*)/edit
  • 可选子路由
  • 在子目录中工作,如果使用 ->set_basepath('/yoursubdir')
  • 自定义响应头
    • 下载
    • 头信息
    • 重定向
    • 503错误

安装

composer require jblond/php-router

示例

静态路由

require 'jblond/Autoloader.php';
new \jblond\Autoloader();
$router = new \jblond\router\Router();
$router->setBasepath('');
$router->init();

$router->add('/', function () {
    echo 'Welcome';
});

$router->add('/info/', function () {
    phpinfo();
});

$router->add('/test.html', function () {
    echo 'test.html Welcome';
});
$router->add('/post/', function () {
	require 'post.html';
});

$router->post('/post/reciver/', function () {
    print_r($_POST);
});
$router->run();

动态路由

$router->add('/user/(.*)/edit', function ($id) {
    echo 'Edit user with id ' . $id;
});

$router->get('/test/(:any)', function () {
    print_r(filter_input(INPUT_SERVER, 'REQUEST_URI'));
});
	

与其他库的集成,即使用闭包

$tpl = new \Acme\Template\Template();
$router->add('/closure', function () use ($tpl) {
    // $tpl->...
    echo 'closure';
});

定义404未找到页面

$router->add404(function ($url) {
    header("HTTP/1.0 404 Not Found");
    echo '404 :-( ' . $url;
});
$router->run();

响应

$router->get('/503/', function (){
    $response = new \jblond\router\Responses();
    $response->error503();
});

可选子模式

可以使用 ? 后跟常规模式来制作可选路由子模式。

$router->get(
    '/phonebook(\/[A-Za-z]+(\/[A-Za-z]+(\/[A-Za-z]+(\/[0-9-]+)?)?)?)?/',
    function ($lastname = null, $surname = null, $street = null, $number = null) {
        if(!$lastname) {
            echo 'Phonebook all entries';
            return;
        }
        if(!$surname){
            echo 'Phonebook lookup lastname: ' . $lastname;
            return;
        }
        if(!$street){
            echo 'Phonebook lookup lastname: ' . $lastname . ' Surname: ' . $surname;
            return;
        }
        if(!$number){
            echo 'Phonebook lookup lastname: ' . $lastname . ' Surname: ' . $surname . ' Street: ' . $street;
            return;
        }
        echo ' FULL SEARCH';
});

有关正则表达式,请参阅 https://regexper.com/#%2Fphonebook(%5C%2F%5BA-Za-z%5D%2B(%5C%2F%5BA-Za-z%5D%2B(%5C%2F%5BA-Za-z%5D%2B(%5C%2F%5B0-9-%5D%2B)%3F)%3F)%3F)%3F%2F

也可以用于测试您的正则表达式: http://www.phpliveregex.com/ 使用 preg_match

Apache重写配置

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

在 Apache 2.4 中,您可以使用

FallbackResource /index.php