摘要:可以通過來直接設置路由前綴給添加前綴通過,還是通過就可以了匹配包含的匹配包含的好了,這兩個框架的路由基本比較和應用就這些了,還有一些比如控制器路由和如何自定義中間件等在后續再寫吧,或者請自行查閱文檔,以上內容如有錯誤請指出。
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--路由篇
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25831.html
摘要:本章以實戰方式來對比以下與的寫法。寫這類的文章也遭到了很多質疑,作為一個手記去發布僅僅為了讓想去學習其他語言的朋友了對新語言的一個認識,不是去對比其不同。 showImg(https://segmentfault.com/img/bVbi4ot?w=800&h=533); 前言 作為一名PHP程序員,我感到榮幸。但在時代不斷的變遷中,要具備足夠的知識才可生存。 那就從Go語言學起把。 ...
摘要:簡述的生命周期采用了單一入口模式,應用的所有請求入口都是文件。分發請求一旦應用完成引導和所有服務提供者都注冊完成,將會移交給路由進行分發。此外,由于對動態方法的獨特用法,也使測試起來非常容易。 本書的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作為現在最流行的 PHP 框架,其中的知識較多,所以單獨拿出來寫一篇。 簡述 La...
摘要:但是不用擔心,我們后續的教程會陸續講解相關的內容。所以上面的路由注冊其實就是負責解決訪問的時候的響應。 原文來自:https://jellybool.com/post/programming-with-laravel-5-routers-views-controllers-workflow 免費視頻教程地址 https://laravist.com/series/laravel-5-b...
摘要:官方地址是目前最流行的框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱為工匠,其中的模板引擎容器以及擴展包為業務的開發提供了極大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,lara...
閱讀 1518·2023-04-25 17:41
閱讀 3040·2021-11-22 15:08
閱讀 842·2021-09-29 09:35
閱讀 1605·2021-09-27 13:35
閱讀 3323·2021-08-31 09:44
閱讀 2715·2019-08-30 13:20
閱讀 1938·2019-08-30 13:00
閱讀 2556·2019-08-26 12:12