Laravel是我最喜欢的PHPweb开发框架,所以我也希望能在Go的web框架中选择一个像Laravel一样简单易用的全栈框架。看了Beego、Echo、Gin、Iris的文档,最终选择了Iris。当然,我没有从性能的角度考虑。我之所以选择Iris,是因为它可以快速开发,而且所有支持的功能都令人赏心悦目。应该很多像我这样的PHPer都在使用Laravel,同时也在学习Go,所以为了方便Laravel开发者快速转Iris开发,我准备写一系列的两个框架的对比文章。基本路由Iris构建基本路由和Laravel的基本路由很相似,只需要一个URI和一个闭包:LaravelRoute::get('foo',function(){return'HelloWorld';});Irisapp.Get("/foo",func(ctxiris.Context){ctx.WriteString("HelloWorld")})可用的路由方式Iris和Laravel一样,可以响应任何HTTP请求路由:LaravelRoute::get($uri,$回调);路由::发布($uri,$callback);路由::put($uri,$callback);路由::补丁($uri,$callback);路由::删除($uri,$callback);Route::options($uri,$callback);Irisapp.Post("/",func(ctxiris.Context){})app.Put("/",func(ctxiris.Context){})app.Delete("/",func(ctxiris.Context){})app.Options("/",func(ctxiris.Context){})app.Trace("/",func(ctxiris.Context){})app.Head("/",func(ctxiris.Context){})app.Connect("/",func(ctxiris.Context){})app.Patch("/",func(ctxiris.Context){})都支持LaravelRoute::match(['get','post'],'/',function(){});Route用于注册可以响应的路由multipleHTTPrequests::any('foo',function(){});Irisapp.Any("/",func(ctxiris.Context){})路由参数必填参数Iris路由必填参数的定义类似Laravel的那个,这里需要注意的是Laravel的路由参数不能包含——字符,可以用下划线_代替:LaravelRoute::get('user/{id}',function($id){return'User'.$id;});Irisapp.Get("/user/{id}",func(ctxiris.Context){userID,err:=ctx.Params().GetInt("userid")iferr!=nil{//}ctx.Writef("User%d",userID)})正则约束。Iris还支持正则约束。直接在路由参数中设置很方便。Laravel的路由设置可以通过where链的方法来设置,也很直观:LaravelRoute::get('user/{name}',function($name){})->where('name','[A-Za-z]+');Irisapp.Get("/user/{name:stringregexp(^[A-Za-z]+)}",func(ctxiris.Context){})Iris有全局约束对路由参数没有全局约束。Laravel可以在RouteServiceProvider的引导中定义模式,但Iris可以通过标准宏或自定义宏来约束参数:Laravelpublicfunctionboot(){Route::pattern('id','[0-9]+');parent::boot();}Irisapp.Get("/profile/{id:intmin(3)}",func(ctxiris.Context){})//当然标准宏包括string,alphabetical,file,路径除了int。当然你也可以自己注册一个宏来改变约束规则==paramValue}})//实现app.Macros().type.RegisterFunc()方法来命名路由。Iris和Laravel都支持命名指定路由,方法很相似:LaravelRoute::get('user/profile',function(){})->name('profile');Irisapp.Get("/user/profile",func(ctxiris.Context){}).Name="profile"是Laravel生成的命名链接route()方法用于根据路由名称和参数生成URL链接。Iris也提供了相应的方法来生成链接:Laravel$url=route('profile',['id'=>1]);Irisrv:=router.NewRoutePathReverser(app)url:=rv.URL("profile",1)//URL(routeNamestring,paramValues...interface{})//Path(routeNamestring,paramValues...interface{}不包含host和protocol检查当前路由检查当前请求是否指向来一个原因:Laravelif($request->route()->named('profile')){}Irisifctx.GetCurrentRoute().Name()=="profile"{}routeGroup路由组可以共享路由属性,而Laravel支持的路由组属性,Iris基本都支持,非常相似优雅,中间件可以通过中间件限制路由请求,这对日常开发很有用,比如做Auth验证,可以直接通过做隔离中间件:LaravelRoute::middleware(['auth'])->group(function(){Route::get('user/profile',function(){//使用auth中间件});});Irisauthentication:=basicauth.New(authConfig)needAuth:=app.Party("/user",authentication){needAuth.Get("/profile",h)}子域路由在Laravel中,路由组可以作为子域的通配符,使用路由组属性的domainkey来声明子域Iiris可以直接通过Party设置:LaravelRoute::group(['domain'=>'{subdomain}.myapp.com'],function(){Route::get('user/{id}',function($account,$id){//});});Irissubdomain:=app.Party("subdomain."){subdomain.Get("/user/{id}",func(ctxiris.Context){//})}dynamicSubdomains:=app.Party("*."){dynamicSubdomains.Get("/user/{id}",func(ctxiris.Context){//})}路由前缀为URL添加前缀,Laravel传递Prefix,Iris仍然可以传递PartyURL});});IrisadminUsers:=app.Party("/admin"){adminUsers.Get("/users",,func(ctxiris.Context){//匹配包含“/admin/users”的URL})}好了,这两个web框架的路由的基本比较和应用就到这里了。还有一些,比如controller路由以及如何自定义中间件等等,后面会写,或者自己参考文档。以上内容如下,如有错误请指出。转载请注明:转载自瑞安是菜鸟|LNMP技术栈笔记如果觉得本文对你很有帮助,不妨给本文打赏链接地址:从PHPLaravel到GoIris--路由
