HTTP 路由
基本路由
您将在 app/Http/routes.php
中定义应用中的大多数路由,这个文件加载了 App\Providers\RouteServiceProvider
类。
大多数基本的 Laravel 路由都只接受一个 URI 和 一个 闭包(Closure)
参数:
基本 GET 路由
Route::get('/', function()
{
return 'Hello World';
});
其他基础路由
Route::post('foo/bar', function()
{
return 'Hello World';
});
Route::put('foo/bar', function()
{
//
});
Route::delete('foo/bar', function()
{
//
});
为多种请求注册路由
Route::match(['get', 'post'], '/', function()
{
return 'Hello World';
});
注册路由响应所有 HTTP 请求
Route::any('foo', function()
{
return 'Hello World';
});
通常情况下,您将会需要为您的路由产生 URL,您可以使用 url
辅助函数来操作:
$url = url('foo');
CSRF 保护
Laravel 提供简易的方法,让您可以保护您的应用程序不受到 CSRF (跨网站请求伪造) 攻击。跨网站请求伪造是一种恶意的攻击,借以代表经过身份验证的用户执行未经授权的命令。
Laravel 会自动在每一位用户的 session 中放置随机的 token
,这个 token 将被用来确保经过验证的用户是实际发出请求至应用程序的用户:
插入 CSRF Token 到表单
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
当然也可以在 Blade 模板引擎使用:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
您不需要手动验证在 POST、PUT、DELETE 请求的 CSRF token。 VerifyCsrfToken
HTTP 中间件将保存在 session 中的请求输入的 token 配对来验证 token 。
X-CSRF-TOKEN
除了寻找 CSRF token 作为「POST」参数,中间件也检查 X-XSRF-TOKEN
请求头,比如,你可以把 token 存放在 meta 标签中, 然后使用 jQuery 将它加入到所有的请求头中:
<meta name="csrf-token" content="{{ csrf_token() }}" />
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
现在所有的 AJAX 请求会自动加入 CSRF token:
$.ajax({
url: "/foo/bar",
})
X-XSRF-TOKEN
Laravel 也在 cookie 中存放了名为 XSRF-TOKEN
的 CSRF token。你可以使用这个 cookie 值来设置 X-XSRF-TOKEN
请求头。一些 Javascript 框架,比如 Angular ,会自动设置这个值。
注意: X-CSRF-TOKEN
和 X-XSRF-TOKEN
的不同点在于前者使用的是纯文本而后者是一个加密的值,因为在 Laravel 中 cookies 始终是被加密过的。如果你使用 csrf_token()
函数来作为 token 的值, 你需要设置 X-CSRF-TOKEN
请求头。
方法欺骗
HTML 表单没有支持 PUT
、PATCH
或 DELETE
请求。所以当定义 PUT
、PATCH
以及 DELETE
路由并在 HTML 表单中被调用的时候,您将需要添加隐藏 _method
字段在表单中。
发送的 _method
字段对应的值会被当做 HTTP 请求方法。举例来说:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>
路由参数
当然,您可以获取请求路由的 URI 区段。
基础路由参数
Route::get('user/{id}', function($id)
{
return 'User '.$id;
});
路由参数不能包含 -
字符。使用下划线替代 (_
)。
可选择的路由参数
Route::get('user/{name?}', function($name = null)
{
return $name;
});
带默认值的路由参数
Route::get('user/{name?}', function($name = 'John')
{
return $name;
});
使用正则表达式限制参数
Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');
使用条件限制数组
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
定义全局模式
如果你想让特定路由参数总是遵询特定的正则表达式,可以使用 pattern
方法。在 RouteServiceProvider
的 boot
方法里定义模式:
$router->pattern('id', '[0-9]+');
定义模式之后,会作用在所有使用这个特定参数的路由上:
Route::get('user/{id}', function($id)
{
// 只有 {id} 是数字才被调用。
});
取得路由参数
如果需要在路由外部取得其参数,使用 input
方法:
if ($route->input('id') == 1)
{
//
}
你也可以使用 Illuminate\Http\Request
实体取得路由参数。当前请求的实例可以通过 Request
facade 取得,或透过类型提示 Illuminate\Http\Request
注入依赖:
use Illuminate\Http\Request;
Route::get('user/{id}', function(Request $request, $id)
{
if ($request->route('id'))
{
//
}
});