imarc/anchor

PHP 的路由库

1.4.0 2017-11-08 22:43 UTC

README

========================================= = Anchor // a routing library for PHP 5 =

Build Status

以下是一个关于如何使用 Anchor 的简短示例。阅读完这个示例后,可以在类的 PHPDoc 文档中找到更多详细信息。

  1. 为您的控制器配置 Anchor

使用 Anchor 与控制器类最简单的方法是将包含控制器的文件夹传递给 Anchor。Anchor 会尝试通过将 .php 添加到类名来加载您的控制器类。

Anchor::setControllerPath('/path/to/controller/dir');

如果您使用的是 PHP 5.2 命名空间,其中下划线字符被转换为文件夹分隔符(例如,斜杠),那么请务必添加

Anchor::setLegacyNamespacing();

如果您想自己加载控制器类,则需要授权 Anchor 使用它们。这有助于防止基于用户输入的漏洞。为了使 Anchor 能够使用它们,必须授权所有控制器类或它们继承的类。以下代码授权了继承自 BaseController 的所有类。

Anchor::authorize('BaseController');

  1. 添加路由

接下来,您需要定义 Anchor 将要处理的路由。Anchor::add() 接受两个参数,即要路由的 URL 和要传递给它的回调函数。

Anchor::add('/', 'Home::main');

虽然 Home::main 看起来像是一个静态方法,但所有控制器方法都必须是公共实例方法,否则 Anchor 不会使用它们。这是另一个安全特性。

您可以使用以下四个符号之一,后跟一个请求变量名称来从 URL 中提取值。这四个符号如下:

! - 匹配字母、数字和下划线 : - 匹配任何非斜杠字符 % - 匹配数字 @ - 匹配字母

    • 匹配任何字符

以下是一个从 URL 中提取数字 ID 和字符串 slug 的示例

Anchor::add('/blog/%id-:slug', 'Blogs::view');

这些值将按照您定义的名称推入 $_GET 和 $_REQUEST 超全局变量中。

类为在控制器包含通配符时确定应运行哪个控制器保留了三个参数名称。这些参数是 "class","method" 和 "namespace"。例如

Anchor::add('/!class/!method', '::');

如果 URL 是 /blog/list,则将尝试运行 Blog::list() 控制器方法;如果 URL 是 /about/team,则将尝试运行 About::team()。

有一个特殊的路由,即 404 路由,如果其他路由不匹配,则会调用它。

Anchor::add('404', 'Home::notFound');

  1. 运行 Anchor

一旦配置了 Anchor 并添加了路由,您可以通过调用

Anchor::run();

  1. 链接

您可以通过传递控制器和任何所需数据到链接方法来生成控制器的链接

Anchor::link('Users::view id slug', 5, 'john_smith');

这将找到具有参数 id 和 slug 的 Users::view 路由并创建一个链接。如果不存在具有这些参数的路由,则它们将作为查询字符串参数添加。

  1. 完整示例

// 网站根目录下的 .htaccess 文件

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

// bootstrap.php

include $_SERVER['DOCUMENT_ROOT'] . '/../init.php';

Anchor::setControllerPath('/path/to/controller/dir');

Anchor::add('/!class/!method/%id-:slug', '::'); Anchor::add('/!class/!method', '::'); Anchor::add('/', 'Home::main'); Anchor::add('404', 'Home::notFound');

Anchor::run();

// /path/to/controller/dir 目录中的控制器类 Users.php

class Users { public function view($data) { $id = $_GET['id']; // 在这里进行操作并输出响应 } }