前言:
最近在学习 laravel 框架,学习的版本是 7.15.0 ,记录一下学习过程中遇到的问题和难点以及一些总结。
路由入门
最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此为基础提供一个非常简单优雅的路由定义方法:
Route::get('hello', function () {
return 'Hello Laravel';
});
在 routes/web.php 中定义该路由:
访问方式:通过接口调用工具就可以测试接口地址http://127.0.0.1:86/api/hello,这里采用的是 apizza,附上地址 https://www.apizza.net/
Hello api Laravel
默认路由文件:
所有 Laravel 路由都定义在位于 routes 目录下的路由文件中,这些文件通过框架自动加载,相应逻辑位于 app/Providers/RouteServiceProvider 类。routes/web.php 文件定义了 Web 界面的路由,这些路由被分配到了 web 中间件组,从而可以使用 Session 和 CSRF 保护等功能。routes/api.php 中的路由是无状态的,这是因为被分配到了 api 中间件组。
对大多数应用而言,都是从 routes/web.php 文件开始定义路由。定义在 routes/web.php 中的路由可以通过在浏览器地址栏输入相应的 URL 进行访问,例如,你可以通过 http://127.0.0.1:86/user 访问下面的路由:
Route::get('/user', 'UsersController@index');
在 app/Http/Controllers 文件夹下添加 UsersController 控制器并且新增 index 方法:
public function index()
{
echo 'hello laravel7';
}
返回结果
hello laravel7
定义在 routes/api.php 文件中的路由通过 app/Providers/RouteServiceProvider 的处理被嵌套在一个路由群组中, 在这个群组中,所有路由会被自动添加 /api 前缀,所以你不需要再到路由文件中为每个路由手动添加,你可以通过编辑 RouteServiceProvider 类来修改路由前缀以及其他的路由群组选项:
app/Providers/RouteServiceProvider.php
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
路由参数
必选参数
Route::get('user/{id}', function ($id) {
return 'User ' . $id;
});
在浏览器中访问 http://127.0.0.1:86/api/user/1111,就会得到以下输出:
User 1111
可以根据需要在路由中定义多个路由参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
return $postId . '-' . $commentId;
});
访问:http://127.0.0.1:86/api/posts/1111/comments/2222
1111-2222
路由参数需要通过花括号 {} 进行包裹并且是拼音字母,这些参数在路由被执行时会被传递到路由的闭包。路由参数名称不能包含 - 字符,如果需要的话可以使用 _ 替代,比如如果某个路由参数定义成 {post-id} 则访问路由会报错,应该修改成 {post_id} 才行。路由参数被注入到路由回调/控制器取决于它们的顺序,与回调/控制器名称无关。
可选参数
有必选参数就有可选参数,这可以通过在参数名后加一个 ? 标记来实现,这种情况下需要给相应的变量指定默认值,当对应的路由参数为空时,使用默认值:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
访问:http://127.0.0.1:86/api/user/小明
小明
路由分组
路由分组的目的是让我们在多个路由中共享相同的路由属性,比如中间件和命名空间等,这样的话我们定义了大量的路由时就不必为每一个路由单独定义属性。共享属性以数组的形式作为第一个参数被传递给 Route::group 方法。
嵌套的分组会尝试智能地将属性合并到父分组中,中间件和 where 条件会直接被合并,而路由命名、命名空间、以及路由前缀会被附加到父组件对应属性之后。命名空间分隔符和 URI 中的斜杠会被自动添加到合适的位置。
中间件
要给某个路由分组中定义的所有路由分配中间件,可以在定义分组之前使用 middleware 方法。中间件将会按照数组中定义的顺序依次执行。
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second Middleware
});
Route::get('user/profile', function () {
// Uses first & second Middleware
});
});
命名空间
路由分组另一个通用的例子是使用 namespace 方法分配同一个 PHP 命名空间给该分组下的多个控制器。
默认情况下,RouteServiceProvider 在一个命名空间分组下引入所有路由文件,并指定所有控制器类所在的默认命名空间是 App\Http\Controllers,因此,我们在定义控制器的时候只需要指定命名空间 App\Http\Controllers 之后的部分即可。
Route::namespace('Admin')->group(function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
路由前缀
prefix 方法可以用来为分组中每个路由添加一个给定 URI 前缀,例如,你可以为分组中所有路由 URI 添加 admin 前缀 。
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
这样我们就可以通过 http://127.0.0.1:86/admin/users 访问路由了。
附一个实例:
//中间件
Route::middleware('checkToken')->group(function () {
//admin模块
Route::prefix('admin')->namespace('Admin')->group(function () {
//分组
Route::prefix('admin')->group(function () {
Route::get('getAdminList', 'AdminController@getAdminList');
});
});
});