Laravel是我最喜欢的PHP Web开发框架,因此也但愿能够在Go的Web框架中选择一个相似Laravel这样的好用又全栈的框架,刷了一下Beego, Echo , Gin, 以及Iris的文档,最终仍是选择Iris,固然我是没有从性能角度考虑,只是从能够快速开发,且支持的特性全还有就是看着顺眼的心理选择了Iris,应该有很多PHPer像我同样使用Laravel同时在学习Go,因此为了便于Laravel开发者能够快速的转到Iris开发,我准备写一系列这二者框架的比较文章。php
Iris构建基本路由和Laravel的基本路由很像,都只须要一个URI与一个闭包:laravel
Laravelgit
Route::get('foo', function () { return 'Hello World'; });
Irisgithub
app.Get("/foo", func(ctx iris.Context) { ctx.WriteString("Hello World") })
Iris和Laravel同样,可以响应任何的HTTP请求路由:web
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);
Irisapp
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请求的路由二者一样都支持框架
Laraveldom
Route::match(['get', 'post'], '/', function () { }); Route::any('foo', function () { });
Iriside
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--路由篇