Laravel是我最喜歡的PHP Web開發框架,所以也希望可以在Go的Web框架中選擇一個類似Laravel這樣的好用又全棧的框架,刷了一下Beego, Echo , Gin, 以及Iris的文件,最終還是選擇Iris,當然我是沒有從效能角度考慮,只是從可以快速開發,且支援的特性全還有就是看著順眼的心理選擇了Iris,應該有不少PHPer像我一樣使用Laravel同時在學習Go,所以為了便於Laravel開發者可以快速的轉到Iris開發,我準備寫一系列這兩者框架的比較文章。
基本路由
Iris構建基本路由和Laravel的基本路由很像,都只需要一個URI與一個閉包:
Laravel
Route::get('foo', function () {
return 'Hello World';
});
Iris
app.Get("/foo", func(ctx iris.Context) {
ctx.WriteString("Hello World")
})
可用的路由方法
Iris和Laravel一樣,能夠響應任何的HTTP請求路由:
Laravel
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Iris
app.Post("/", func(ctx iris.Context){})
app.Put("/", func(ctx iris.Context){})
app.Delete("/", func(ctx iris.Context){})
app.Options("/", func(ctx iris.Context){})
app.Trace("/", func(ctx iris.Context){})
app.Head("/", func(ctx iris.Context){})
app.Connect("/", func(ctx iris.Context){})
app.Patch("/", func(ctx iris.Context){})
對於註冊一個可以響應多個HTTP請求的路由兩者同樣都支援
Laravel
Route::match(['get', 'post'], '/', function () {
});
Route::any('foo', function () {
});
Iris
app.Any("/", func(ctx iris.Context){})
路由引數
必填引數
Iris的定義路由必填引數和Laravel差不多,這裡需要注意下Laravel的路由引數不能包含 -
字元,可以用用下劃線 _
替換:
Laravel
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Iris
app.Get("/user/{id}", func(ctx iris.Context) {
userID, err := ctx.Params().GetInt("userid")
if err != nil {
//
}
ctx.Writef("User %d", userID)
})
正則約束
Iris同樣支援正則約束,直接在路由引數中設定很方便,Laravel的路由設定可以透過where
鏈式方法,也很直觀:
Laravel
Route::get('user/{name}', function ($name) {
})->where('name', '[A-Za-z]+');
Iris
app.Get("/user/{name:string regexp(^[A-Za-z]+)}", func(ctx iris.Context) {})
全域性約束
Iris沒有對路由引數全域性約束,Laravel可以透過RouteServiceProvider
的boot
中定義pattern
來定義,但是Iris可以透過標準的macro
或者自定義macro
來約束引數:
Laravel
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
Iris
app.Get("/profile/{id:int min(3)}", func(ctx iris.Context) {
})
//當然標準的 macro 除了int 還有string,alphabetical,file,path當然你也可以自己註冊一個macro來改變約束規則
app.Macros().String.RegisterFunc("equal", func(argument string) func(paramValue string) bool {
return func(paramValue string){ return argument == paramValue }
})
//實現app.Macros().型別.RegisterFunc()方法即可
命名路由
Iris和Laravel都支援給指定的路由命名,而且方式很像:
Laravel
Route::get('user/profile', function () {
})->name('profile');
Iris
app.Get("/user/profile", func(ctx iris.Context) {
}).Name = "profile"
為命名生成連結
Laravel透過route()
方法來根據路由名和引數生成URL連結,Iris也提供了對應的方法來生成連結:
Laravel
$url = route('profile', ['id' => 1]);
Iris
rv := router.NewRoutePathReverser(app)
url := rv.URL("profile",1)
//URL(routeName string, paramValues ...interface{})
//Path(routeName string, paramValues ...interface{} 不包含host 和 protocol
檢查當前路由
檢查當前請求是否指向了某理由:
Laravel
if ($request->route()->named('profile')) {}
Iris
if ctx.GetCurrentRoute().Name() == "profile" {}
路由組
路由組可以共享路由屬性,Laravel所支援的路由組屬性Iris也基本都支援,而且很像,都很優雅.
中介軟體
透過中介軟體可以對路由請求約束,對於日常開發非常有用,比如做Auth驗證,可以直接透過中介軟體來做隔離:
Laravel
Route::middleware(['auth'])->group(function () {
Route::get('user/profile', function () {
// 使用 auth 中介軟體
});
});
Iris
authentication := basicauth.New(authConfig)
needAuth := app.Party("/user", authentication)
{
needAuth.Get("/profile", h)
}
子域名路由
在Laravel中,路由組可以用作子域名的萬用字元,使用路由組屬性的 domain
鍵宣告子域名。Iiris可以透過Party
來直接設定:
Laravel
Route::group(['domain' => '{subdomain}.myapp.com'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Iris
subdomain := app.Party("subdomain.")
{
subdomain.Get("/user/{id}", func(ctx iris.Context) {
//
})
}
dynamicSubdomains := app.Party("*.")
{
dynamicSubdomains.Get("/user/{id}", func(ctx iris.Context) {
//
})
}
路由字首
給URL新增字首,Laravel 透過prefix
,Iris還是透過Party
就可以了
Laravel
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// 匹配包含 "/admin/users" 的 URL
});
});
Iris
adminUsers := app.Party("/admin")
{
adminUsers.Get("/users", , func(ctx iris.Context) {
// 匹配包含 "/admin/users" 的 URL
})
}
好了,這兩個web框架的路由基本比較和應用就這些了,還有一些比如控制器路由和如何自定義中介軟體等在後續再寫吧,或者請自行查閱文件,以上內容如有錯誤請指出。
轉載請註明: 轉載自Ryan是菜鳥 | LNMP技術棧筆記
如果覺得本篇文章對您十分有益,何不 打賞一下
本文連結地址: 從PHP Laravel 到 Go Iris--路由篇
本作品採用《CC 協議》,轉載必須註明作者和本文連結