简单的PHP路由器,用于将URL路由到类方法。

dev-master 2014-01-07 11:47 UTC

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
    • index.php
    • `.htaccess` 文件

在您的 `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 参数。