Http 路由与控制器
单一路由
laravel 中存在路由分发,它使得路由简短美观,路由分发在 /routes/web.php 文件中定义。形如:
Route::get($uri,$callback)
除了get方法外,还可以是post、put、delete、patch、options 等
$callback 可以是控制器方法,也可以是闭包
多响应式路由
Route::match(['get','post'],'/',function(){ //match 通过数组定义能够响应的 http 请求 }); Route::any('foo',function(){ //any 能够响应所有 http 请求 });
路由参数
Route::get('posts/{post}/name/{name?}',function($first,$second){
//路由上的形参名与闭包中的形参名不存在对应关系,只有参数次序存在一致性
//路由参数存在多个可选参数时,只有在最后的可选参数能为空,且可选参数必须有默认值
//路由参数名不允许有中划线,可用下划线代替
});
路由约束
Route::get('user/{id}/{name}',function($id,$name){
//
})->where(['id'=>'[0-9]+','name'=>'[a-z]+']);
Route::get('user/{id}/name/{name?}','UserController@user')
->where(['id'=>'[0-9]+','name'=>'[a-z]+']);
全局约束
如果希望某一路由参数在全局范围内都遵循一个确定的正则表达式约束,则可以使用 pattern 方法。在 RouteServiceProvider 的boot方法里定义这些模式:
/**
* 定义你的路由模型绑定, pattern 过滤器等。
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
pattern 一旦被定义,便会自动应用到所有该参数名称的路由上:
Route::get('user/{id}', function ($id) {
// 仅在 {id} 为数字时执行...
});
命名路由
命名路由就是给路由起别名,它主要是方便调用。
Route::get('user/profile', function () {
//
})->name('profile');
Route::get('user/profile', 'UserController@showProfile')->name('profile');
// 利用全局辅助函数route 生成 URL...
$url = route('profile');
// 重定向...
return redirect()->route('profile');
如果是有定义参数的命名路由,可以把参数作为route函数的第二个参数传入,指定的参数会自动插入到URL中对应的位置:
Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => $id]);
CSRF保护
任何指向web中的POST、PUT、DELETE路由的HTML表单请求,都应该包含一个CSRF令牌,否则这个请求将被拒绝。
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
表单伪造
HTML表单没有支持PUT、PATCH或DELETE动作。所以需要伪造:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
也可以使用辅助函数method_field来生成隐藏的输入字段_method:
{{ method_field('PUT') }}