路由

Lime 框架的路由功能将 URI 映射到特定 HTTP 请求方法(比如:GET,POST,PUT,DELETE,OPTIONS 或 PATCH)的回调函数上。如果 Lime 应用未找到与 HTTP 请求 URI 和方法相配备的路由,将返回一个 404 Not Found 响应。

基本路由

大多数基本的 Lime 路由都接受一个 资源 URI 和 一个 闭包(Closure) 参数。

一个 HTTP 请求方法

基本 GET 路由

$app = new \Lime\Lime();
$app->get('/', function() {
    return 'Hello World!';
});

其他基础路由(POST,PUT,DELETE,OPTIONS 或 PATCH)

请求方法主要通过第一个参数来设定:

$app = new \Lime\Lime();

$app->post('/users/id', function() {
    return 'Hello World!';
});

$app->put('/users/id', function() {
    return 'Hello World!';
});

$app->delete('/users/id', function() {
    return 'Hello World!';
});

为多种请求注册路由

$app->map(['GET', 'POST'], '/users/id', function() {
    return 'Hello World!';
});

注册路由响应所有 HTTP 请求

$app->any('/users/id', function() {
    return 'Hello World!';
});

Method 覆盖

浏览器并不原生支持 HTTP 的 PUT、DELETE、OPTIONS 请求。为了解决这个问题,请确保你的 HTML 表单的请求方式为 post,然后像下面例子一样,在 HTML 表单中添加一项请求方式覆盖参数 _METHOD

<form action="/user/1" method="post">
    ...
    <input type="hidden" name="_METHOD" value="DELETE">
    <input type="submit" value="Delete">
</form>

路由参数

可以在路由的 资源 URI 中加入参数。

基础路由参数

在下面例子中,在路由 URI 中加入了一个参数:<name>

$app->get('/user/<name>', function($name) {
    return "Hello, {$name}!";
});

可选路由参数

在路由 URI 中,“(”“)” 之间的内容为可选:

$app->get('/user(/<name>)', function($name = null) {
    $name = is_null( $name ) ? 'World' : $name;
    return "Hello, {$name}!";
});

路由字段 name 是可选的,这个路由将会接受如下 HTTP 请求:

- /user
- /user/admin
- /user/visitor

带默认值的路由参数

$app->get('/user(/<name>)', function($name = 'World') {
    return "Hello, {$name}!";
});

如果一个 HTTP 请求的可选参数被省略,回调函数中定义的默认值会被代替使用。

使用条件限制数组

指定路由参数的满足条件。如果未满足指定条件,那么路由就不会执行。

$app->get('/post/<id>', function($id) {
    return $id;
})->conditions(['id' => '[0-9]+']);

上面的例子,路由字段 id 是有条件限制的,必须为数字,这个路由将会接受如下 HTTP 请求:

- /post/10
- /post/250

资源式路由

在路由中指定网络上的资源,也可以说是控制器和动作,我们只要将闭包(Closure) 参数改为字符串,并使用 controller@action 形式。使用资源式路由前要先指定资源目录 resource.path,这个下面会说。例如,你的控制器类全名为 \Controllers\Post,调用的方法为 new(),你可以像这样注册一个路由:

$app->post('/post/new', '\Controllers\Post@new');

资源目录

你可以在你的资源目录中存放控制器、模型等。可以使用下面的方法设置资源目录:

新建一个 Lime 应用实例时:

$app = new \Lime\Lime([
    'resource.path' => '/app',
]);

或者

$app->configure('resource.path', '/app');

这时资源式的路由会将资源定位到 /app 文件夹下。

命名路由

命名路由可以让你使用特定路由生成 URL。

$app->get('/user/<name>', function($name) {
    // ...
})->name('user');

路由分组

$app->group('/post', function() {
    $this->get('/new', function() {
        // code ...
    });

    $this->post('/del', function() {
        // code ...
    });
});

路由分组的过滤函数

$app->group('/post', function() {
    // code ...
}, function() {
    // code ..
});

路由过滤

路由过滤会在路由回调函数被调用前按顺序被执行。我们可以在路由过滤中进行判断或者其他操作:

$app->post('/user/add', function() {
    // ...
})->filter(function($params) {
    if ($_POST['token']) {
        header('Location', '/index.php');
    }
});

如果调用每个路由过滤时返回 false 则路由过滤会中断:

$app->get('/post/list', function() {
    // ...
})->filter(function() {
    // 1
})->filter(function() {
    // 2
    return false;
})->filter(function() {
    // 3
    // 不会被执行
});

此路由的第三个路由过滤函数不会被执行。

添加参数

$app->get('/user/<name>', function($name) {
    // ...
})->params('id', 10);