link-hack / router
Link-Hack 是 Amanpreet Singh 的 Simple PHP Router 的 Hack Lang HHVM 版本
Requires
- hhvm: >=2.3.3
This package is not auto-updated.
Last update: 2024-09-28 18:58:26 UTC
README
最小化的用于你的 web 应用和 API 的路由器,它能够轻松地将所有项目链接起来。它快速、简洁。
特性
- RESTful 路由
- 通配符简化路由编写
- 正则表达式路由,释放无限可能
- 命名路由,轻松创建链接
- 支持路由的“前后”功能
- 在 Ubuntu 14.04、hhvm 3.2.0-dev+2014.06.18 (rel)、nginx 1.4.6 上测试
依赖
Hack HHVM
http://docs.hhvm.com/manual/en/install.php
Nginx
安装
手动包含
require("Link-Hack/src/Link.hh");
Composer
composer require link-hack/router
配置
Nginx
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /path/Link-Hack/src/; # Changet to path of your environment
server_name _; #catchall
if (!-e $request_filename)
{
rewrite ^/(.*)$ /YourRouter.hh?/$1 last;
break;
}
location / {
root /path/Link-Hack/src/; # Changet to path of your environment
fastcgi_pass 127.0.0.1:9000; #Whatever HHVM daemon is set to run on.
# or if you used a unix socket
# fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
fastcgi_index YourRouter.hh;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
基础
简单路由
function routeMe(): void { echo 'I am routed'; } Link::all( Map{ '/' => Map{'routeMe' => []} });
命名路由
在 Link-Hack 中,可以命名路由,然后以简单优雅的方式生成链接。
function nameMe() :void { echo 'I am named'; } Link::all( Map{ '/named' => Map{'nameMe' => [], 'Its my name' => []} });
命名必须作为数组的第二个参数提供,而第一个参数是路由处理程序。
用法
这些命名路由可用于创建无烦恼的链接。
<a href="<?hh echo Link::route('Its my name') ?>">Go to named route</a>
使用类的路由
Link 可以轻松地将类作为路由处理程序处理,但请注意,非静态类将在构造和 RESTful 上都进行处理。
$routes = Map{ '/' => Map{'IndexController::getMeHome' => []}, // Static function '/home' => Map{'HomeController' => []}, // Class '/office' => Map{'OfficeController' => []} // Class }); Link::all($routes);
RESTful 路由
RESTful 路由对 Link-Hack 来说轻而易举。
class HomeController { function get() :void { echo 'You have got to home :)'; } function post() :void { echo 'You have posted to home'; } function put() :void { echo 'You have put to home'; } function delete() :void { echo 'You have deleted the home :('; } } Link::all( Map{ '/' => Map{'HomeController' => [], 'HomeRoute' => []} });
动态路由
正则表达式缩写
Link-Hack 支持数字、字符串和字母数字通配符,分别用 {i} {s} {a}
表示。
$routes = Map{ '/' => Map{'IndexController' => []}, '/{i}' => Map{'IndexController' => []}, // Parameter in place of {i} will be passed to IndexController '/posts/{a}/{i}/{s}' => Map{'PostsController' => []} }; Link::all($routes);
纯正则表达式
Link-Hack 支持编写基于正则表达式的路由。
$routes = Map{ '/regex/([\d]+)/([a-zA-Z]+)/([a-zA-Z]+)' => Map{'regexController' => []} }; Link::all($routes);
补充处理程序
通过 Link-Hack,可以添加通用的“前后”处理程序,这样这些处理程序将在任何路由被路由之前和之后执行。可以这样做:
function universalBeforeHandler( $id ) :void { echo 'Hello I occurred before with ' . $id . '\n'; } function universalAfterHandler( ?$id ) :void { if( $id ) echo 'Hello I occurred after with ' . $id; else echo 'I simply occurred after'; } function main() :void { echo 'I simply occurred\n' } Link::before( Map{'universalBeforeHandler' => array('12')} ); // If you want to pass parameters to them, pass them as arrays Link::after( Map{'universalAfterHandler' => []} ); // else just don't specify them. Link::all( Map{ '/' => Map{'main' => []} })
现在转到浏览器中的 '/' 以找到
Hello I occurred before with 12 I simply occurred I simply occurred after.
向命名路由传递参数
如果命名路由的路径中有通配符,则可以向命名路由传递参数,从而通过单个命名路由生成动态链接。
function nameMe( $i, $s ) :void { echo 'I am named and I have been passed ' . $i . $s ; } Link::all( Map{ '/named/{i}/{s}' => Map{'nameMe' => [], 'Its my name' => []} });
现在通过 Link 生成链接
echo Link::route( 'Its my name', array(1, 'Me') );
这反过来会生成 /named/1/Me
,浏览器将返回 I am named and I have been passed 1Me
[404,500] 错误
您可能需要向路由映射中添加一个 404 处理程序,Link 将处理未找到的路由。如果 Link-Hack 没有找到定义的 404/500 路由,它将只发送适当的头信息。如果从控制器/方法/函数/闭包中抛出异常,将执行 500 路由。
function notFound() :void { echo 'This page is missing'; } function errorFound() :void { echo 'Oops, something went wrong, try again later'; } function mainPage() :void { throw new Exception('Meh? :('); } Link::all( Map{ '/' => Map{'mainPage' => []}, '404' => Map{'notFound' => []}, '500' => Map{'errorFound' => []} });