link-hack/router

Link-Hack 是 Amanpreet Singh 的 Simple PHP Router 的 Hack Lang HHVM 版本

安装: 2

依赖: 0

建议者: 0

安全: 0

星标: 15

关注者: 5

分支: 3

开放问题: 1

语言:Hack

dev-master 2017-08-12 21:18 UTC

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

http://wiki.nginx.org/Install

安装

手动包含

	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' => []}
});

许可证

知识共享署名-相同方式共享 3.0 未本地化

http://creativecommons.org/licenses/by-sa/3.0/