phpf/routes

Phpf Routes 包

dev-master 2015-02-08 20:14 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:40:14 UTC


README

请求路由组件。

###依赖

  • PHP 5.3+
  • Phpf\Util
  • Phpf\Http
  • Phpf\Event

基本用法

路由构造函数接受一个参数,一个 Phpf\Event\Container 对象。事件在分发过程之前和之后触发,也用于错误处理。

use Phpf\Routes\Router;
$events = new Phpf\Event\Container;
$router = new Router($events);

定义路由有两种方式

  1. “常规”方式 - 将数组传递给 addRoute() 方法创建路由。
  2. 在端点(或路由命名空间)下 - 只有当请求与端点匹配时才会创建和解析端点路由。这大大减少了所需的解析(因此,时间)。

####常规

// Add a route at '/login/' that calls App\UserController::login() for GET and POST requests
$router->addRoute('login', array(
	'callback' => array('App\UserController', 'login'), 
	'methods' => array('GET', 'POST')
));

####端点

端点包含一个闭包,当请求与给定的端点路径匹配时执行。闭包应返回端点路由的数组。

$router->endpoint('admin', function ($router) {
	
	return array(
		'users' => array(
			'callback' => array('App\AdminController', 'users')
		),
		'pages' => array(
			'callback' => array('App\AdminController', 'pages')
		),
		'options' => array(
			'callback' => array('App\AdminController', 'options')
		),
	);
});

在这个例子中,对于任何以 admin/ 开头的请求,路由器将执行闭包并尝试匹配返回的路由。请注意,$router 是由路由器本身传递的。

这会注册路由 admin/usersadmin/pagesadmin/options

$router->endpoint('admin', function ($router) {
	
	$router->setController('App\AdminController');
	
	return array(
		'users' => array(
			'action' => 'users'
		),
		'pages' => array(
			'action' => 'pages'
		),
		'options' => array(
			'action' => 'options'
		),
	);
});

这有点重复 - 为了简化,您可以为端点下的所有路由设置一个控制器

$router->endpoint('admin', function ($router) {
	
	$router->setController('App\AdminController');
	
	return array(
		'users' => 'users',
		'pages' => 'pages',
		'options' => 'options',
	);
});

或者更简单

但是请注意,您不能使用最后一种方式更改 HTTP 方法。

###未静态调用的控制器

我们使用字符串定义了路由回调。然而,它们不是静态调用的;如果匹配的路由回调使用字符串作为第一个元素,路由器将尝试在调用方法之前实例化此类。这样,控制器回调在对象上下文中运行,但除非需要,否则不需要实例化对象。

use Phpf\Http\Request;
use Phpf\Http\Response;
$request = new Request;
$router->dispatch($request, new Response($request));

分发

要路由/分发请求,将 Phpf\Http\RequestPhpf\Http\Response 对象传递给路由器的 dispatch() 方法

  1. ##路由参数
$router->addRoute('users/<user_id:[\d]{1,4}>', array(
	// ...
));
  1. 路由参数可以以两种方式定义
$router->addVar('user_id', '[\d]{1,4}');

$router->addRoute('users/<user_id>', array(
	// ...
));

内联 - 简单地将正则表达式添加到路由中,如下所示

$router->addRoute('users/<user_id:int>', array(
	// ...
));
$router->addRoute('page/<anything:segment>', array( // 'segment' matches everything up to a slash
	// ...
));

预先注册 - 注册变量名和正则表达式,然后在路由中使用

有一些预先注册的参数也可以用于或重命名以在路由中使用

##回调函数

$router->addRoute('users/<user_id:int>/posts/<year:[\d]{4}>', array(
	'callback' => array('App\UserController', 'getYearPosts'),
));

// In App\UserController class:

public function getYearPosts($year, $user_id) {
	// ...
}

在匹配路由后,将使用路由参数调用控制器方法。路由和回调函数必须使用相同的参数名称。 这意味着如果您的路由中包含名为 user_id 的参数,则相应的回调方法必须接受名为 user_id 的参数。