laravel 学习笔记之路由

路由

默认路由文件

  • 所有的路由文件都在 routes 目录中,主要包括 web.php 和 api.php
    • web.php 用于定义网页相关的路由,在 RouteServiceProvider 中可以看到,默认的命名空间为 'App\Http\Controllers',默认路由中间件组为 'web',位于 'App\Http\Controllers\Kernel' 的 $middlewareGroups 属性中,后续如果添加了新的中间件可以在相应位置添加
    • api.php 用于定义接口相关的路由,默认添加 api 路由前缀,默认的命名空间同样为 'App\Http\Controllers',默认路由中间件组为 'web',位于 'App\Http\Controllers\Kernel' 的 $middlewareGroups 属性中

路由参数

路由参数

参数通常放在 {} 中,并且参数名只能为字母,同时路由参数不能包含 - 符号,如果有需要,可以用下划线 (_) 代替。也可以定义多个参数。

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 = 'John') {
    return $name;
});

正则表达式约束

通过 where 方法传入参数名和正则表达式进行参数格式的约束,假如参数不符合正则表达式则会报 404 错误

Route::get('hello/{name?}', function ($name) {
    return "hello " . $name;
})->where('name', '[A-Za-z]+');

路由命名

通过在路由定义上链式调用 name 方法来指定路由名称,然后使用全局辅助函数 route 来生成指定的 URL 或者重定向到指定路由(ps:个人感觉重定向用的会多一点),同时如果是有定义参数的命名路由,可以把参数作为 route 函数的第二个参数传入

Route::get('hello/{name?}', function ($name = '') {
    return "hello " . $name;
})->name('name');

//然后在需要的地方使用如下
$url = route('name', ['name' => 'John']);
echo $url;
//输出结果为:http://127.0.0.1:8000/hello/John

//重定向
return redirect()->route('name');

路由组

在定义同一个模块或者功能下的路由时,可以使用 Route::group 创建路由组来定义共同的路由属性,例如:中间件、路由前缀、命名空间等。

Route::namespace('User')->group(function () {
    Route::get('user/{id}', 'UserController@getUser');
    Route::get('list', 'UserController@getUserList');
});

路由中间件

在 group 之前使用 middleware 方法来为路由组中的全部路由指定中间件,中间件执行顺序为数组中的顺序

Route::middleware(['first', 'second'])->group(function () {
    //下面的路由使用 first 和 second 两个中间件
    Route::get('user/{id}', 'UserController@getUser');
    Route::get('list', 'UserController@getUserList');
});

命名空间

在 group 之前使用 namespace 方法将命名空间分配给路由组中的全部路由,且默认情况下,RouteServiceProvider 会在命名空间组中引入你的路由文件,默认为 App\Http\Controllers

Route::namespace('User')->group(function () {
    //完整命名空间为:App\Http\Controllers\User
    Route::get('user/{id}', 'UserController@getUser');
    Route::get('list', 'UserController@getUserList');
});

//用户可以通过访问 http://127.0.0.1:8000/user/5 访问相应路由

路由前缀

在 group 之前使用 prefix 方法为路由组设置路有前缀

Route::prefix('User')->namespace('User')->group(function () {
    //完整命名空间为:App\Http\Controllers\User
    Route::get('user/{id}', 'UserController@getUser');
    Route::get('list', 'UserController@getUserList');
});

//用户可以通过访问 http://127.0.0.1:8000/User/user/5 访问相应路由
posted @ 2020-10-14 16:58  黑夜的海  阅读(147)  评论(0编辑  收藏  举报