從PHP Laravel 到 Go Iris--路由篇

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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可以通過RouteServiceProviderboot中定義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--路由篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.