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();