Laravel中的路由基础
路由简介
简单来说:将用户的请求转发给相应的程序(控制器)进行处理。
作用:建立url和程序、视图之间的映射关系。
请求类型:get /post/put/patch/delete
基础路由
以下案例均通过本地地址 http:localhost/laravel/public/ ---- 进行访问
本例以5.2版本为例,路由文件位于app/Http/routes.php文件,最新的laravel8路由文件位于route/web.php文件中。
get路由
Route::get('basic1', function () {
return 'hello world';
});
访问:public/basic1 即可看到页面上显示出 hello world字样。
post路由
// 不能通过浏览器直接访问
Route::post('basic2', function () {
return 'basic2';
});
match多请求路由
match只能响应已经设置的请求。
Route::match(['get', 'post'], 'multy1', function () {
return 'multy1';
});
多请求路由 Route::match([想要的请求,多个逗号分开],‘路由的名字’, 执行的函数) match是指定想要的请求类型。
设置多请求路由后,public/multy1可以支持get请求和post请求都可以访问这个地址。
any多请求路由
any可以响应所有类型的请求。
Route::any('multy2', function () {
return 'multy2';
});
Route::any('路由的名字', 执行的函数)
直接访问public/multy2 也可以看到浏览器显示了multy2。执行的是get请求。
路由参数
简单的get传参
Route::get('user/{id}', function ($id) {
return 'user-id-' . $id;
});
浏览器访问public/user/1,浏览器就可以看到输出:user-id-1
传递的参数可选
Route::get('user/{name?}', function ($name = null) {
return 'user-name-' . $name;
});
这时,浏览器输入/public/user/abc,浏览器就会输出:user-name-abc
$name =null是默认值,如果,修改默认值,访问的时候没有传递参数部分,那么就会显示默认值。
Route::get('user/{name?}', function ($name = 'sy') {
return 'user-name-' . $name;
});
浏览器输入/public/user,浏览器就会输出:user-name-sy
注意:如果浏览器访问的是/public/user/,注意末尾红色斜线“/”,多了这个斜线,就会出现访问报错的提示。
传递的参数使用正则表达式进行限制
Route::get('user/{name?}', function ($name = 'sean') {
return 'user-name-' . $name;
})->where('name', '[A-Za-z]+');
以上是对name参数值的类型进行限制,如果不是字母,那么就会抛出一个错误。
访问:public/user/12 会抛出一个错误;public/user/abc 会正确输出:user-name-abc。
语法:Route::get()->where('想要验证的字段', '正则表达式'),如果不符合验证规则就会报错
多个字段的参数验证
多个字段的验证, 直接将要验证的字段和正则规则放到一个数组中。如下:
Route::get('user/{id}/{name?}', function ($id, $name = 'sean') {
return 'user-id-' . $id . '-name-' . $name;
})->where([
'id' => '[0-9]+',
'name' => '[A-Za-z]+'
]);
以上是分别对id参数和name参数分别制定正则验证的规则。只有传递的参数与类型相符才会正常输出。否则会抛出错误。
路由别名
定义:在设定路由时,可以给该路由设置一个“别名alias”,主要作用就是当我们修改路由的指向时,可以不用修改视图模板中使用route()函数生成别名对应的url。
语法:Route::get('路由名称', ['as' => '别名的名称', 执行的函数])
Route::get('user/member-center', ['as' => 'center', function () {
// 返回别名对应的url,为了方便如果美化了url,那么对应模板中的链接是通过别名获得的,那么就无需更改
return route('center');
}]);
这时候访问:public/user/member-center, 浏览器会输出:http://localhost/laravel/public/user/member-center,其中起主要作用的就是 route('center') route('路由别名的名称')
。他会输出对应路由的url地址。当我修改路由地址:
Route::get('user/member-mid', ['as' => 'center', function () {
return route('center');
}]);
当我访问public/user/member-mid的时候,浏览器会输出:http://localhost/laravel/public/user/member-mid
路由群组
有时候路由会有更多需求,如url区段等,使用路由群组套用到多个路由,而不用每个路由都要进行设置。如:
语法:group(['prefix' => '路由前缀名称',执行的函数])
我们要实现这样一个功能:给群组内的路由都加一个前缀,如访问/public/member/user/center,在群组内每个路由前面需要加一个前缀/member才能访问到,如:public/member/user/center
Route::group(['prefix' => 'member'], function () {
Route::get('user/center', ['as' => 'center', function () {
return route('center');
}]);
Route::any('multy2', function () {
return 'member-multy2';
});
});
如此,要访问user/center路由,需要通过地址:public/member/user/center才可以访问到,得到输出:http://localhost/laravel/public/member/user/center;同样的,要访问multy2路由,需要访问/member/multy2才可以。
注意:将multy2加入到member群组后,这个multy2与2.4中的multy2就是不同的路由了。
路由中输出视图
在resources/views中定义视图文件。
Route::get('view', function () {
return view('welcome');
});
然后使用view方法渲染视图文件。
注意:路由只是用来接收请求,然后转化给控制器的方法进行处理,很少会在路由中直接输出视图。