HTTP路由
- 基本路由
- 路由参数
- 必填参数
- 可选参数
- 正则表达式约束
- 命名路由
- 路由组
- 中间件
- 命令空间
- 路由前缀
基本路由
你可以在 route/web.php 文件中定义应用程序的全部路由。最基本的Lumen路由仅接受URL和一个Closure:
$router->get('foo', function(){
return 'Hello, World';
});
$router->post('foo', function(){
//
});可供使用的路由方法
我们可以注册路由来响应任何方法的HTTP请求:
$router->get($uri, $callback);
$router->post($uri, $callback);
$router->put($uri, $callback);
$router->patch($uri, $callback);
$router->delete($uri, $callback);
$router->options($uri, $callback);路由参数
必填参数
当然,有时需要在路由中捕获一些URL片段。例如,从URL中捕获用户的ID,可以通过通过定义路由参数来执行此操作:
$router->get('user/{id}', function ($id) {
return "User:" . $id;
});也可以根据需要在路由中定义多个参数:
$router->get('posts/{postId}/comments/{commentId}', function ($postId, $commentId) {
//
});路由的参数都会被放在[大括号]内。当运行路由时,参数会传递到Closure里面。
注意:路由参数不能包含-字符。请用下划线_代替。
可选参数
你可以通过将部分路由URI包含在[...]中来定义可选的路由参数。那么像/foo[bar]将会匹配到/foo和/foobar。可选参数仅支持放在URI的末尾。换句话说,你不能在路由定义的中间位置放置可选参数:
$router->get('user'[/{name}]', function ($name = null) {
return $name;
});正则表达式约束
你可以通过在路由定义中使用正则表达式来约束路由参数的格式:
$router->get('user2/{name:[a-zA-Z]}', function () {
//
});命名路由
命名路由可以方便的为特定路由生成URL或者进行重定向。你可以使用as数组键指定名称到路由上:
$router->get('profile', ['as' => 'profile', function() {
//
}]);你还可以指定控制器行为的路由名称:
$router->get('profile', [
'as' => 'profile',
'uses' => 'UserController@showProfile',
]);生成指定路由的URL
为路由制定了名称后,就可以使用全局辅导函数route来生成链接或者重定向到该路由:
//Generating URLs...
$url = route('profile');
//Generating Redirects...
return redirect()->route('profile');
如果是有定义参数的命名路由,可以把参数作为route函数的第二个参数传入,指定的参数将会自动插入到URL中对应的位置:
$router->get('user/{id}/profile', ['as' => 'profile', function ($id) {
return $id;
}]);
$url = route('profile', ['id' => 1]);路由组
路由群组允许你共用路由属性,例如:中间件、命名空间,你可以利用路由组统一为多个路由设置共同属性,而不需要在每个路由都设置一次。共用属性被指定为数组格式,当做$router->group方法的第一个参数。
为了了解更多路由群组的相关内容,我们可以通过几个常用样例来熟悉这些特性。
中间件
要给路由组中所有的路由分配中间件,你可以在group属性数组中使用middleware字段。中间件会依照它们在数组中列出的顺序来运行:
$router->group(['middleware' => 'auth'], function () use ($router) {
$router->get('/', function () {
//使用Auth中间件
});
$router->get('user/profile', function () {
//使用Auth 中间件
});
});命名空间
另一个常见的例子是,指定相同的PHP命名空间给控制器群组。可以使用namespace参数来指定群组内所有控制器的命名空间:
$router->group(['namespace' => 'Admin'], function () use ($router) {
//使用"App\Http\Controllers\Admin"命名空间
$router->group(['namespace' => 'User', function () use ($router) {
//使用"App\Http\Controllers\Admin\User" 命名空间...
}]);
});路由前缀
通过路由群组数组属性中的prefix,在路由群组内为每个路由指定的URI加上前缀。例如,你可能想要在路由群组中将所有的路由URI加上前缀admin:
$router->group(['prefix,' => 'admin'], function () use ($roter) {
$router->get('users', function () {
//匹配The "/admin/users"URL
});
});你也可以使用prefix参数去指定路由群组中共用的参数:
$router->group(['prefix' => 'accounts/{accountId}'], function () use ($router) {
$router->get('detail', function ($accountId) {
//匹配The "/accounts/{accountId}/detail" URL
});
});HTTP中间件
- 简介
- 定义中间件
- 注册中间件
- 全局中间件
- 为路由指定中间件
- 中间件参数
- Terminal中间件
简介
HTTP中间件提供了一个方便的机制来过滤进入应用程序的HTTP请求。例如,lumen内置了一个中间件来验证用户的身份认证。如果用户未通过省份证,中间件将会把用户导向登录页面,反之,当用户通过了身份证,中间件将会通过此请求并接着往下执行。
当然,除了身份证之外,中间件也可以被用来运行各式各样的任何,如:CORS中间件负责替换所有即将离开程序的响应加入适当的标头;而日志中间件则可以记录所有出入应用从程序的请求。
所有的中间件都放在app/Http/Middleware目录内。
定义中间件
你可以通过赋值lumen内置的示例文件ExampleMiddleware来创建一个中间件。在这个中间件中,我们只允许参数age大于200的请求才能访问该路由。否则,我们将此用户重定向到首页"home"这个URI上。
正如你所见,假如给定的age参数小于或者等于200,这个中间件将返回一个HTTP重定向到客户端;否则,请求将进一步传递到应用中。要让请求继续传递到应用程序中(即允许“通过”中间件验证的),只需要使用$request作为参数去调用回调函数$next。
最好将中间件想象为一系列HTTP请求必须经过才能进入你的应用的层。每一个都会检查请求
(是否符合某些条件),(如果不符合)甚至可以(在请求访问你的应用之前)完全拒绝掉。
前置/后置中间件
中间件是在请求之前或者之后运行取决于中间件本身。例如,接下来的这个中间件将在应用处理请求before执行其任务:
















