Laravel—路由
路由
路由:将信息从源地址传递到目的地的角色,相当于后台函数处理
路由定义:
Route::get('foo',function(){
return 'Hello World';
});
路由文件在Laravel/routes目录中,大部分应用的构建都在web.php中定义,可以通过url访问定义的路由:DomainName/foo
,其中foo为自己定义的标识符
可用的路由方法
有多种与http响应的方式
Route::get($uri,$callback);
Route::post($uri,$callback);
Route::put($uri,$callback);
Route::patch($uri,$callback);
Route::delete($uri,$callback);
Route::option($uri,$callback);
多个可响应HTTP请求的路由
使用match
方法,也可以使用any
方法注册一个实现所有HTTP请求的路由
Route::match(['get','post'],'/',function(){
//
})
Route::any('foo',function(){
//
})
CSRF保护
web路由文件中定义的post,put,delete路由,在HTML表单中要包含一个CSRF
令牌字段,否则,这个请求会被拒绝
<form method="POST" action="/profile">
@csrf
...
</form>
重定向路由
定义一个路由指向另一个URL路由,使用Route::redirect
,实现快速实现重定向
Route::redirect(‘/here’,’/there’,301);//301表示永久重定向,302表示临时重定向
视图路由
用于返回一个试图,使用Route::view
,view有三个参数,前两个为必填,分别为URI和视图名称,后一个可选,可以传入一个数组给视图
Route::view('/welcome','welcome');
Route::view('/welcome','welcome',['name'=>'XiaoMing']);
路由参数
- 必填参数
参数名称不能包含-
字符,路由参数被注入路由回调/控制器取决于它们的顺序,与名称无关
//一个参数
Route::get('user/{id}',function($id){
return 'User '.$id;
});
//多个参数
Route::get('posts/{post}/comments/{comment}',function($postId,$commentId){
return $postId . '-' . $commentId;
});
- 可选参数
可以通过在参数名后加一个?
标记这是可选参数,这种情况下要给相应的变量指定默认值
Route::get('user/{name?}',function($name = null){
return $name;
});
Route::get('user/{name?}',function($name = 'John'){
return $name;
});
正则约束
可以通过where
方法来约束路由的参数格式,where接受参数名和一个正则表达式来定义该参数如何被约束
Route::get('user/{name}',function($name){
//$name必须是字母并且不为空
})->where('name','[A-Za-z]+');
Route::get('user/{id}',function($id){
//$id必须是数字
})->where('id','[0-9]+');
Route::get('user/{id}/{name}',function($id,$name){
//同时指定id和name的数据格式
})->where(['id' =>'[0-9]+','name' => '[a-z]+']);
全局约束
使用pattern
方法,可以全局的参数被给定的正则表达式约束,需要在app/provides/RouteServiceProvider中的boot
方法中定义这种约束模式
/**
* 定义路由模型绑定,模式过滤器等
* 全局的id参数都被限制
*
* @return void
*/
public function boot()
{
//
Route::pattern('id','[0-9]+');
parent::boot();
}
命名路由
在路由定义之后使用name
定义路由的名称
route()
返回该路由的URL地址,还可以传递第二个参数给route
//会生成:my url: http://localhost/user/profile
Route::get('user/profile',function(){
//通过路由名称生成URL
return 'my url: '. route('profile');
})->name('profile');
//生成跟网址一样的url:http://localhost/user/123/profile
Route::get('/user/{id}/profile',function(){
$url = 'my uel: '.route('profile',['id'=>$id]);
return $url;
})->name('profile');
为控制器动作指定路由名称:
Route::get('user/profile','UserController@showProfile')
->name('profile');
这样就可以通过以下方法进行重定向:
redirect()
函数用于重定向
Route::get('redirect',function(){
//通过路由名称重定向
return redirect()->route('profile');
});
路由分组
可以让多个路由共享相同的路由属性,共享属性以数组的形式作为第一个参数被传递给Route::group
方法
Route::group(function(){
//各个使用的路由
});
子路由
即路由的嵌套,使用domain
方法来指定
Route::domain('{account}.blog.dev')->group(function(){
Route::get('/user/{id}',function ($account,$id){
Freturn 'This is ' . $account . ' page of User ' . $id;
});
});
如果输入:http://account.blog.test/user/1 ,则显示出:This is account page of User 1
路由前缀
profix
方法可以为分组中的每个路由添加一个URI前缀
Route::prefix('admin')->group(function() {
Route::get('user',function(){
//代码
});
});
这样以后访问路由的网址便是http://localhost/admin/user
路由名称前缀
name
方法可以为每个路由的名字就上前缀
Route::name('admin.')->group(function(){
Route::get('user',function(){
//新的路由名为"admin.user"
})->name('user');
});
频率限制
Laravel自带了一个中间件用于限制应用路由的访问频率,分配throttle
中间件到某个路由或路由分组,throttle
中间件接受两个参数用于判断给定时间(单位:分钟)内的最大请求次数,超出访问次数会报429状态码并提示“Too many requests”
//指定登陆用户每分钟内只能访问下面的分组路由60次
Route::middleware('auth:api','throttle:60,1')->group(function(){
Route::get('/user',function({
//
}));
});
表单伪造方法
HTML表单不支持PUT,PATCH,DELETE行为,当要从HTML表单中调用定义了的PUT、PATCH、DELETE路由时,需要在表单中增加隐藏的_method
输入标签,value值为相应的请求方法
<!-- 第一种方法 -->
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{crsf_token() }}">
</form>
<!-- 第二种方法 -->
<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>