首页 > 编程笔记 > PHP笔记 阅读:13

PHP Laravel路由用法详解(附带实例)

在 Laravel 中,路由用于定义请求的 URL 与对应的处理逻辑之间的映射关系。

路由决定了当用户访问某个 URL 时,应该调用哪个控制器的哪个方法来处理该请求。开发人员需要先在路由配置文件中定义路由,由 Laravel 负责根据路由来进行处理。

本节将对 Laravel 框架的路由进行详细讲解。

配置路由

Laravel 框架的路由需要在 routes\web.php 文件中进行配置,将该文件打开后,会看到里面已经添加了一个路由配置。

具体示例如下:
Route::get('/', function () {
    return view('welcome');
});
上述代码用于配置 Laravel 中的默认根路由,其匹配的路径为“/”,表示当用户访问域名时自动打开一个初始页面。根路由一般表示网站的首页。

view() 函数表示要显示的视图,参数 welcome 是视图文件的名称,对应的视图文件为 resources\views\welcome.blade.php。该文件是一个用 Blade 模板引擎的语法编写的 HTML 模板。Blade 模板引擎是 Laravel 自带的模板引擎。

定义路由的语法格式如下:
Route::请求方式('请求URI', 匿名函数或控制器相应的方法);
在上述语法格式中,请求方式可以是 get、post、put、patch、delete 以及 options。其中,get 和 post 是最常用的方式,其他几种方式常用于开发服务器接口(如 RESTful API),在普通的网站开发中比较少见。

在 Route 类中还提供了 match() 和 any() 这两个静态方法。match() 用于在一个路由中同时匹配多个请求方式,any() 用于在一个路由中匹配任意请求方式,其语法格式如下:
// 同时匹配get和post请求方式
Route::match(['get', 'post'], '请求URI', 匿名函数或控制器相应的方法);
// 匹配任意请求方式
Route::any('请求URI', 匿名函数或控制器相应的方法);
需要注意的是,如果请求方式或URI在路由中无法匹配,Laravel 会报错。因此,在 Laravel 中编写任何控制器的方法前,都需要先定义路由。

请求 URI 可以简单理解为一个完整 URL 地址中从域名后面的“/”开始的路径,不含请求参数。下面演示完整的 URL 对应的请求 URI,具体如下表所示。

表:请求URI示例
完整URL 请求 URI
http://www.laravel.test/ /
http://www.laravel.test/hello/123 /hello/123
http://www.laravel.test/hello/456?a=1 /hello/456

在上述定义的路由中,请求 URI 中的“/”可以省略,如将上述代码中的“/hello”修改为“hello”,运行结果不变。

下面在路由文件中定义路由,用于匹配“/hello”,具体代码如下:
Route::get('/hello', function () {
    return 'hello';   // 返回一个字符串给浏览器,以方便测试
});
通过浏览器访问 http://www.laravel.test/hello,运行结果如下图所示:


图 1 访问自定义路由

Laravel路由参数

Laravel 允许在请求 URI 中传递一些动态的参数,称为路由参数。通过路由参数可以传递一些请求信息,如 id。

在传统的PHP开发中,id 通常使用查询字符串来传递,这种方式的 URL 不太美观,如“http://.../find?id=1”。而路由参数方式的 URL 更加美观,如“http://.../find/1”,这种方式是将 id 的值 1 直接写在请求 URI 中。

路由参数分为必选参数和可选参数,必选参数的语法为“{参数名}”,可选参数的语法为“{参数名?}”。

下面演示如何使用必选参数,示例代码如下:
Route::get('find/{id}', function ($id) {
    return '输入的id为' . $id;
});
在上述代码中,路由参数通过“{id}”的形式来进行传递,该参数名与回调函数中的参数 $id 对应,获取到的参数值会保存在 $id 中。

下面演示如何使用可选参数,示例代码如下:
Route::get('find2/{id?}', function ($id = 0) {
    return '输入的id为' . $id;
});
在上述代码中,“{id?}”表示它是一个可选参数。在设置可选参数后,需要为回调函数的参数 $id 设置一个默认值,此处“id = 0”表示使用 0 作为默认值。如果没有给 $id 设置默认值,在省略可选参数时会报错。

路由别名

路由别名是指给路由设置一个方便使用的名称。那么在什么情况下需要给路由设置别名呢?例如,在视图中使用地址为“/hello/123”的路由,示例代码如下:
<a href="/hello/123">hello</a>
如果视图中有很多处代码都使用了上述路由,当路由发生改变时,所有使用这个路由的代码都需要修改,会非常麻烦。此时,可以给路由“/hello/123”设置别名。设置路由别名后,当在其他地方用到这个路由地址的时候,可以不用书写原来的地址,而是通过别名来引用这个地址。

给路由设置别名需要调用 name() 方法,具体语法格式如下:
Route::请求方式('请求URI', 匿名函数或控制器相应的方法)->name('路由别名');
在上述语法格式中,在 name() 方法中指定路由的别名。下面给路由“/hello/123”设置别名,示例代码如下:
Route::get('/hello/123', function () {
    return 'hello';
})->name('hello');
在上述代码中,给路由“/hello/123”设置别名“hello”。

设置别名后,在视图中就可以通过别名来引用这个地址。只要别名不变,无论路由地址怎么修改,都不会对视图代码造成影响。在视图中使用路由别名的示例代码如下: <a href="{{ route('hello') }}">hello</a> 在上述代码中,“{{ route('hello') }}”是一种视图语法,用于根据路由别名输出路由地址。

路由分组

为了方便路由的管理,我们可以对路由进行分组,对路由分组后,可以对成组的路由进行统一管理。

路由分组使用 Route::group() 来实现,其基本语法格式如下:
Route::group(公共属性数组, 回调函数);
在上述语法格式中,公共属性数组用于指定同组路由的公共属性,如前缀(prefix)、中间件(middleware)等,其他公共属性可以参考 Laravel 官方文档。回调函数中的代码用于定义同组路由,当公共属性为前缀时,这些路由的地址都是剔除公共前缀之后的地址。

例如,路由文件中有如下路由:
/admin/login
/admin/logout
/admin/index
/admin/user/add
/admin/user/del
上述路由的共同点是,开头的地址都是“/admin/”。“/admin/”称为路由的前缀,通过前缀就可以对路由进行分组。

下面演示路由分组的实现,具体代码如下:
Route::group(['prefix' => 'admin'], function () {
    Route::get('login', function () {
        return '这里是/admin/login';
    });
    Route::get('logout', function () {
        return '这里是/admin/logout';
    });
    Route::get('user/add', function () {
         return '这里是/admin/user/add';
    });
});
在上述示例代码中,在公共属性数组中指定路由的前缀是“admin”,回调函数中分别定义每个路由,定义路由的请求URI不需要再添加“admin”。

相关文章