HTTP路由

  • 基本路由
  • 路由参数
  1. 必填参数
  2. 可选参数
  3. 正则表达式约束
  • 命名路由
  • 路由组
  1. 中间件
  2. 命令空间
  3. 路由前缀

基本路由

你可以在 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执行其任务: