5.自定义URL(REST风格)


处理REST风格的请求

程序入口

首先使用loadApp()加载指定的app, 调用用rest()方法获取一个Rest类的实例, 通过实例注册要匹配的uri, 最后调用Rest的run方法.

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

$rest = $web->rest();
$rest->get('/', function() {
    echo 'hello';
});

$rest->post('/', function() {
    echo 'post hello';
});

$rest->run();

REST支持get, post, put, delete请求.

参数匹配

参数可以在注册路由的时候指定:

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

$rest = $web->rest();
$rest->get('/{:name}', function($name) {
    echo "hello {$name}";
});
	
$rest->run();

参数的格式为

{:参数名}

定义好参数后, 在匿名函数中使用同名的变量来获取uri中的值, 多个参数会根据定义顺序依次传入. 还可以使用Rest::rules()方法注册正则验证参数格式

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

$rest = $web->rest();
$rest->rules(array(
    'name'  =>  "/^[a-z]+?$/i",
));

$rest->get('/{:name}', function($name) {
    echo "hello {$name}";
});

$rest->run();

>rules数组的key为路由中配置的{:参数名}, value必须是一个合法的正则表达式

与MVC交互

在REST模式下, 可以很容易的与MVC交互, 利用成熟的MVC模式来处理业务逻辑, 下例在匿名函数内部直接调用指定的控制器和方法.

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

$rest = $web->rest();
$rest->get('/{:name}', function($name) use ($web) {
    $web->get('main:index', array('name'=>$name));
});

$rest->run();

在匿名函数内部, 还可以更细粒度的获取app的各项配置, 如request, response, router等

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

$rest = $web->rest();
$rest->get('/{:name}', function($name) use ($web) {
    $config = $web->getConfig();
    $request = $web->getRequest();
    $response = $web->getResponse();

    $router = $web->getRouter();
    $runtime_config = $web->getRuntimeConfig();
});	

$rest->run();