kiev/router

请求路由器。

dev-master 2013-12-12 00:19 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:43:15 UTC


README

描述

一个用于处理请求的PHP轻量级库。

安装

您可以通过composer安装

{
	"require": {
        "kiev/router": "dev-master"
    }
}

基本用法

<?php

use Kiev\Router\Router;
use Kiev\Router\Route;

$router = new Router();

/** Appending routes to router */
$index = new Route('GET', '/', 'my_controller');
$router->addRoute($index);

$users = new Route('GET', '/users', 'my_controller');
$router->addRoute($users);

$user = new Route('GET', '/users/*', 'my_controller');
$router->addRoute($user);

$messages = new Route('GET', '/users/*/messages', 'my_controller');
$router->addRoute($messages);

$message = new Route('GET', '/users/*/messages/*', 'my_controller');
$router->addRoute($message);

/** Router returns a Kiev\Router\Result instance **/
$result = $router->run($_SERVER);
echo 'My target is: ' . $result->getTarget();
echo 'The method used is: ' . $result->getMethod();
echo 'The params are: ' . PHP_EOL . print_r($result->getParams());

路由

Kiev根据资源将URI与资源标识符配对,资源标识符不是必需的,但当你想使用它时,你可以使用一个*来表示它作为一个参数。以下是一些示例

/
/users/
/users/*/
/users/*/messages/
/users/*/messages/*/

警告:在路由时,Kiev将忽略查询字符串。

路由

路由需要在构造函数中传递三个参数

  • 方法:HTTP方法
  • uri
  • 目标:类名、闭包、自定义名称或任何你想要的东西

您可以使用类或数组来配置路由器。如果您使用数组,内部,路由器将创建一个Route对象

<?php

use Kiev\Router\Router;
use Kiev\Router\Route;

$router = new Router();

/** Appending routes to router */
$index = new Route('GET', '/', 'my_controller');
$router->addRoute($index);

$users = array('method' => 'GET', 'uri' => '/users', 'target' => 'my_controller');
$router->addRoute($users);

在创建路由时,它验证方法,因此如果方法不是有效的HTTP方法(GET、POST、PUT、DELETE、HEAD),则会抛出InvalidArgumentException

结果

结果对象只是用来表示匹配的路由,并且只有三个属性

  • 目标:你在路由中指定的目标;
  • 方法:请求方法;
  • 参数:uri中找到的参数数组;

它们可以通过访问器方法访问

<?php

// ...

$result = $router->run($_SERVER);
echo 'My target is: ' . $result->getTarget();
echo 'The method used is: ' . $result->getMethod();
echo 'The params are: ' . PHP_EOL . print_r($result->getParams());

分发

分发不是项目的目标,所以你必须自己处理。你可以用你的类名、闭包、别名或任何你想要的东西来做。以下是一些示例

<?php

// Class Names

$route = new Route('GET', '/', 'MyPack\MyController');
$router->addRoute($route);

$result = $router->run($_SERVER);
$controller = $result->getTarget();
$method = $result->getMethod();
$params = $result->getParams();

$instance = new $controller;
echo $instance->$method($params);

// Closures

$route = new Route('GET', '/', function($params) { print_r($params) });
$router->addRoute($route);

$result = $router->run($_SERVER);
$target = $result->getTarget();
$params = $result->getParams();

echo call_user_func_array($target, $params);