作者:京东科技 韩国凯前言Go语言定义Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态、强类型、编译型语
顺晟科技
2021-07-06 13:32:20
186
注意:Laravel 路由仅指 Web 中的后端路由。
概念:Laravel 中路由,是指外界访问Laravel应用程序的通路。
作用:定义外界访问 Laravel 应用程序的资源或逻辑处理程序的匹配规则。也就是说,通过路由,我们可以通过与路由匹配的 请求方式1 和 URI2 访问到对应的资源或处理程序。
>= 5.3routes/web.app~5.1, ~5.2app/Http/routes.php
不要再路由中写逻辑代码,逻辑代码请放到controller处理路由缓存不会作用于基于闭包的路由。绝不 在路由配置文件里书写『闭包路由』或者其他业务逻辑代码,因为一旦使用将无法使用 路由缓存 。路由器要保持干净整洁,绝不 放置除路由配置以外的其他程序逻辑优先使用 Restful 路由(即资源路由)
构成Laravel 路由最核心的三部分:请求方式(Method)、URI、处理方式(Action)。
按 Action 可分为:基本路由、控制器路由。
// 基本路由。只需一个 URI 和一个闭包函数 Route::get('index', function () { return 'hello world'; }); // 控制器路由。只需一个 URI 和 一个控制器接口 // 写法一 Route::get('users', 'App\Http\Controllers\UsersController@index'); // 写法二 Route::get('users', ['App\Http\Controllers\UsersController', 'index']); // 写法三 use App\Http\Controllers\UsersController Route::get('users', [UsersController::class, 'index']); // 写法四 Route::namespace('App\Http\Controllers')->group(function () { Route::get('users', 'UsersController@index'); });
按 Method 可分为:基本路由(同上)、视图路由、重定向路由、回退路由、资源路由。
// 视图路由 Route::view( 'index', //uri,必填 'index', //视图名称,必填 ['name' => 'jack', 'gender' => '男'], //参数,选填 ); // 重定向路由 Route::redirect('welcome', 'index'); // 回退路由 Route::fallback(function () { abort(404); }); // 资源路由 Route::resource('users', UsersController::class);
使用可查看已注册的路由。
Route::resource('users', UsersController::class);
向上面的资源路由代码,即是资源路由的一般定义。它等同于定义了以下七个路由:
// 1.获取全部用户数据。相当于访问列表页 Route::get('/users', 'UsersController@index')->name('users.index'); // 2.访问用户的新增页面 Route::get('/users/create', 'UsersController@create')->name('users.create'); // 3.新增用户的逻辑处理 Route::post('/users', 'UsersController@store')->name('users.store'); // 4.访问用户详情展示页面 Route::get('/users/{user}', 'UsersController@show')->name('users.show'); // 5.访问用户详情编辑页面 Route::get('/users/{user}/edit', 'UsersController@edit')->name('user.edit'); // 6.更新用户的逻辑处理 Route::put('/users/{user}', 'UsersController@update')->name('users.update'); // 7.删除用户的逻辑处理 Route::delete('/users/{user}', 'UsersController@destroy')->name('users.destroy');
使用resource
方法时,如果仅使用到部分路由,必须 使用only
列出所有可用路由,绝不 使用except
,因为only
相当于白名单,相对于except
更加直观。路由使用白名单有利于养成『安全习惯』:
Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);
路由参数通常放在{}内,而且参数名只能为字母,同时路由参数不能包含符号,如果需要请使用下划线代替。路由参数会按顺序依次被注入到路由回调或者控制器中,而不受回调或者控制器的参数名称的影响。
// 必填参数 Route::get('users/{id}', function ($id) { return '用户id:'.$id; }); // 可选参数。可选参数必须有默认值。 Route::get('users/{id}/{name?}', function ($id, $name) { return '用户id:'.$id.",用户名:".$name; });
路由命名可以方便地为指定路由生成 URL 或者重定向。
// 写法一 Route::get('users/{id}', function ($id) { return '用户id:'.$id; })->name('userInfo'); // 写法二 Route::get('users/{id}/{name?}', ['as' => 'userInfo', function ($id) { return '用户id:'.$id; }]);
路由组允许内部的路由共享相同的路由属性(中间件、子域名、命名空间、路由前缀、路由名称前缀)
给路由组中的所有路由分配中间件,中间件会按他们在数组中的顺序来运行。
// 写法一 Route::middleware(['web', 'auth'])->group(function () {}); // 写法二 Route::group(['middleware' => ['web', 'auth']], function () {});
// 写法一 Route::domain('test.myapp.com')->group(function () {}); // 写法二 Route::group(['domain' => 'test.myapp.com'], function () {});
// 写法一 Route::namespace('App\Http\Controllers')->group(function () {}); // 写法二 Route::group(['namespace' => 'App\Http\Controllers'], function () {});
// 写法一 Route::prefix('admin')->group(function () {}); // 写法二 Route::group(['prefix' => 'admin'], function () {}) ;
// 写法一 Route::name('admin.')->group(function () {}); // 写法二 Route::group(['as' => 'admin.'], function () {}); // 写法三 Route::group(['name_prefix' => 'admin.'], function () {});
当向路由或控制器行为注入模型ID(默认为”id“字段,可以在 Eloquent 模型重写方法,来使用其他字段),Laravel 提供了一个直接自动将与此ID匹配的模型实例注入到路由中的方法。
隐式绑定
Laravel 会自动解析定义在路由或控制器中,与类型提示的变量名匹配的路由段名称的模型。
Route::get('users/{user}', function (APP\Models\User $user) {});
显示绑定
要注册显式绑定,使用路由器的 model 方法来为给定参数指定类。在 RouteServiceProvider 类中的 boot 方法内定义这些显式模型绑定.
public function boot() { parent::boot(); Route::model('user', App\User::class); }
如果想自定义模型绑定的解析逻辑,可在方法里使用方法。
public function boot() { parent::boot(); Route::bind('user', function ($value) { return App\User::where('name', $value)->first() ?? abort(404); }); }
$route = Route::current(); //当前路由对象 $name = Route::currentRouteName(); //当前路由名称 $action = Route::currentRouteAction(); //当前路由行为
单个路由中不支持命名空间路由参数,无法使用namespace参数或namespace方法
// 1.单个路由。单个路由中不支持命名空间路由参数,无法使用namespace参数或namespace方法 // 1.1 用法一。 Route::get('users/{user}',[ 'middleware' => 'web', //中间件 // 'domain' => 'test.myapp.com', //子域名 'prefix' => 'admin', //路由前缀 'as' => 'admin.user', //路由名称(也叫路由别名) // 控制器/闭包函数选一个。 'uses' => 'App\Http\Controllers\UsersController@index', //控制器行为 ]); // 1.2 写法二。 Route::get('users/{user}',[ 'middleware' => 'web', //中间件 // 'domain' => 'test.myapp.com', //子域名 'prefix' => 'admin', //路由前缀 'as' => 'admin.user', //路由名称(也叫路由别名 function () { return "hello 这是路由整体用法测试"; } ]); // 1.3 写法三。 Route::get('users/{user}', 'App\Http\Controllers\UsersController@index') ->middleware('web') // ->domain('test.myapp.com') ->prefix('admin') ->name('admin.user'); // 2.针对路由组 // 2.1 写法一 Route ::namespace('App\Http\Controllers') ->middleware('web') // ->domain('test.myapp.com') ->prefix('admin') ->name('admin.') ->group(function () { Route::get('users/{user}', 'UsersController@index')->name('user'); }); // 2.2 写法二 Route::group([ 'middleware' => 'web', // 'domain' => 'test.myapp.com', 'prefix' => 'admin', 'namespace' => 'App\Http\Controllers', 'as' => 'admin.' ], function () { Route::get('users/{user}', 'UsersController@index')->name('user'); });
指 HTTP 请求方式:GET、POST、PUT、DELETE等。 ↩ Unified Resource Identifier,统一资源标识符。 ↩
版本 | 默认路由文件 |
---|
26
2023-02
20
2023-02
29
2022-11
19
2022-10
15
2022-10
30
2022-09