phpf / routes
Phpf Routes 包
Requires
- php: >=5.3
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);
定义路由有两种方式
- “常规”方式 - 将数组传递给
addRoute()
方法创建路由。 - 在端点(或路由命名空间)下 - 只有当请求与端点匹配时才会创建和解析端点路由。这大大减少了所需的解析(因此,时间)。
####常规
// 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/users
、admin/pages
和 admin/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\Request
和 Phpf\Http\Response
对象传递给路由器的 dispatch()
方法
- ##路由参数
$router->addRoute('users/<user_id:[\d]{1,4}>', array( // ... ));
- 路由参数可以以两种方式定义
$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
的参数。