1.路由视图
2.路由重定向
如果你需要定义一个重定向到其他 URI 的路由,可以使用 Route::redirect 方法,该方法非常方便,以至于你不需要再定义额外的路由或控制器 来执行简单的重定向逻辑:
Route::redirect('/here', '/there', 301);
其中 here 表示原路由,there 表示重定向之后的路由,301 是一个 HTTP 状态码,用于标识重定向。
CSRF 保护
在 routes/web.php 路由文件中所有请求方式为 PUT、POST 或 DELETE 的路由对应的 HTML 表单都必须包含一个 CSRF 令牌字段,否则,请求会被 拒绝。
关于 CSRF 的更多细节,可以参考 CSRF 文档:
<form method="POST" action="/profile"> {{ csrf_field() }} ... </form>
还是以上面的 foo 路由为例,如果我们不在 VerifyCsrfToken 中间件中排除对它的检查(事实上,这样的操作也不安全),那么就需要在表单提交 中带上 csrf_token 字段:
这样,当我们访问 http://blog.test/form 然后在页面点击提交按钮后,页面会跳转到 http://blog.test/foo 并显示如下内容:
This is a request from get or post
必选参数
有时我们需要在路由中获取 URI 请求参数。例如,如果要从 URL 中获取用户 ID,需要通过如下方式定义路由参数:
Route::get('user/{id}', function ($id) { return 'User ' . $id; });
这样我们在浏览器中访问 http://blog.test/user/1,就会得到以下输出:
User 1
可以根据需要在路由中定义多个路由参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { return $postId . '-' . $commentId; });
根据上面的示例,路由参数需要通过花括号 {} 进行包裹并且是拼音字母,这些参数在路由被执行时会被传递到路由的闭包。路由参数名称不能包 含 - 字符,如果需要的话可以使用 _ 替代,比如如果某个路由参数定义成 {post-id}则访问路由会报错,应该修改成 {post_id} 才行。路由参数被 注入到路由回调/控制器取决于它们的顺序,与回调/控制器名称无关。
可选参数
有必选参数就有可选参数,这可以通过在参数名后加一个 ? 标记来实现,这种情况下需要给相应的变量指定默认值,当对应的路由参数为空时,使用 默认值:
Route::get('user/{name?}', function ($name = null) { return $name; });
Route::get('user/{name?}', function ($name = 'John') { return $name; });
这时如果定义的路由是下面这个的话,访问 http://blog.test/user 会返回 John。
正则约束
Route::get('user/{id}/{name}', function ($id, $name) {
// 同时指定 id 和 name 的数据格式
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
如果想要路由参数在全局范围内被给定正则表达式约束,可以使用 pattern
方法。需要在 RouteServiceProvider
类的 boot
方法中定义这种约束模式:app\providers\RouteServiceProvider.php
当路由参数不为数字时,该路由会被约束。
命名路由
命名路由为生成 URL 或重定向提供了方便,实现起来也很简单,在路由定义之后使用 name 方法链的方式来定义该路由的名称:
Route::get('user/profile', function () {
// 通过路由名称生成 URL
return 'my url: ' . route('profile');
})->name('profile');