liam-chapman / router
简单的PHP路由器,用于将URL路由到类方法。
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-24 05:28:48 UTC
README
一个简单的PHP路由器,用于根据匹配的URI字符串或模式映射已加载的类方法
此脚本仅路由类、方法或闭包。它假设您的类库已经被包含或自动加载
此类已更新以与composer兼容,现在使用命名空间'Router'。如果您需要与PHP 5.2兼容,请删除命名空间
基本用法示例
以下是一个将索引路由到特定类和方法的简单示例。
require 'src/Router/router.php';
$router = new Router\Router;
$router->actions(array(
'/' => 'myclass.mymethod'
));
$router->execute();
URI模式
有三个参数可用于匹配URL
- :string (字符串)
- :int (整数)
- :any (任何内容!)
模式的基本用法示例
示例URI: '/blog/article/test-post/1'
require 'src/Router/router.php';
$router = new Router\Router;
$router->actions(array(
'/blog/article/:string/:int' => 'blog.article'
));
$router->execute();
然后,在您的类中,这些模式作为可访问的参数传递。
例如
class Blog {
function article ($title, $id) {
// fetch data with title and id
}
}
通过为字符串和整数使用特定模式,您可以过滤和清理数据以确保其有效性。
请求类型
默认情况下,所有请求都使用GET方法找到。但是,如果您需要使用替代请求方法,例如POST、PUT或DELETE,只需在方法前加上请求类型即可。
例如
class Blog {
function POST_article () {
// send through post data here
$post = $_POST;
}
}
匿名函数/闭包
如果您正在运行PHP >= 5.3,现在您可以使用匿名函数而不是链接到特定的类或控制器。这有助于创建API的一些基本函数或调试代码。
例如
require 'src/Router/router.php';
$router = new Router\Router;
$router->actions(array(
'/debug/:string/:int' => function ($title, $id) {
echo $title . ' - ' . $id;
exit;
}
));
$router->execute();
直接请求
如果您不需要在框架或完整的项目中包含此类;您可以可选地将路由器用作小型任务的简单框架。
例如
require 'src/Router/router.php';
$app = new Router\Router;
$app->request('/test', function () {
echo 'Test!';
});
$app->execute();
通过在类内部使用魔法方法 __call(),您也可以创建特定的请求类型。
例如
require 'src/Router/router.php';
$app = new Router\Router;
$app->get('/test', function () {
echo 'Test via get!';
});
$app->post('/test', function () {
echo 'Test via post!';
});
$app->execute();
如果您需要使用直接请求方法来分组操作,您仍然可以使用 actions 方法与它一起使用。
例如
require 'src/Router/router.php';
$app = new Router\Router;
$app->get('/test', function () {
echo 'Test via get!';
});
$app->post('/test', function () {
echo 'Test via post!';
});
$app->actions(array(
'/testing' => function () {
echo 'testing'
},
'/another-test/:string/:int' => function ($title, $id) {
echo $title . ' ' . $id;
}
));
$app->execute();
如果您选择在项目中使用此路由器,但您还使用路由器作为框架的来源,您仍然能够路由到已包含/自动加载的现有类。
例如
require 'src/Router/router.php';
$app = new Router\Router;
$app->get('/test', function () {
echo 'Test via get!';
});
$app->request('/blog/article/:int', 'blog.article');
$app->execute();
如果您使用PHP < 5.4,您必须使用 'use' 将变量解析到回调作用域中,以下是一个示例。在PHP >= 5.4中,'use' 可以是可选的。
例如
require 'src/Router/router.php';
$app = new Router\Router;
$db = new Database; // fake db class
$app->get('/test', function () use ($db) {
// do stuff here!
});
$app->execute();
静态调用
您可以选择不实例化类,而是进行静态调用。
例如
require 'src/Router/router.php';
Router::get('/hello/:string', function ($string) {
echo 'Hello ' . $string . '!';
exit;
});
Router::post('/test', 'myclass.mymethod');
如果您同时使用静态调用和实例化,请确保在静态回调中使用 exit(); 或 die();,否则将在输出中附加 404 错误。
如果您检查源代码,您会发现它实际上不是真正的静态,但它可以工作。我可能需要在将来重建其部分。
如何在项目中包含此内容
现在可以在packagist上找到它,因此您可以使用composer包含它,供应商/包名称为"liam-chapman/router"。或者,要开始,您可以将它放在您自己的自定义项目自动加载器中,并在启动/设置/配置文件中实例化它。
例如,如果您有一个index.php文件,您的请求被路由到该文件;您可能有一个单独的路由文件来保持项目整洁。
项目目录结构示例
- my_project/
- config/
- routes.php
- lib/
- src/
- Router/
- router.php
- Router/
- src/
- index.php
- `.htaccess` 文件
- config/
在您的 `index.php` 文件中,您可能会看到如下内容:
<?php
// other stuff here like constants and settings etc.
// autoload your classes - https://php.ac.cn/manual/en/function.spl-autoload-register.php
spl_autoload_register('your_autoload_function');
// instantiate your router
$router = new Router\Router;
// get routes
$router->actions( include_once('config/routes.php') );
// start router
$router->execute();
显然,这是一个简单的例子,您也会使用带路径的 `dirname(FILE)` 或 `DIR`。
然后,在您的 `config/routes.php` 文件中,您可能会看到如下内容:
<?php
return array(
'/blog/article/:int' => 'blog.article',
'/blog' => 'blog.index',
'/' => 'pages.home'
);
请查看以下其他关于 .htaccess 规则的说明!
其他说明
需要注意的是,如果您将其用作框架,您将不得不使用 .htaccess 文件,并从新文件(如 index.php)运行这些操作。以下是一个基本的 .htaccess 代码示例,您可以使用它来开始:
AddDefaultCharset utf-8
Options FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteRule ^(.*)$ index.php?$1 [QSA,L]
在初始化路由器时,可以选择忽略查询字符串作为 URI 的一部分。默认情况下是这样做。通过将其设置为 false,它将附加到 URI 上,这样您就可以创建带有查询字符串的路由。
例如
$router = new Router\Router(0);
$router->actions(array(
'/test?var=hello' => 'myclass.mymethod'
));
$router->execute();
即使忽略了查询字符串,您仍然可以传递 URL 参数。