资讯专栏INFORMATION COLUMN

从PHP Laravel 到 Go Iris--路由篇

lingdududu / 3142人阅读

摘要:可以通过来直接设置路由前缀给添加前缀通过,还是通过就可以了匹配包含的匹配包含的好了,这两个框架的路由基本比较和应用就这些了,还有一些比如控制器路由和如何自定义中间件等在后续再写吧,或者请自行查阅文档,以上内容如有错误请指出。

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--路由篇

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25831.html

相关文章

  • PHP To Go 转型手记 (终)

    摘要:本章以实战方式来对比以下与的写法。写这类的文章也遭到了很多质疑,作为一个手记去发布仅仅为了让想去学习其他语言的朋友了对新语言的一个认识,不是去对比其不同。 showImg(https://segmentfault.com/img/bVbi4ot?w=800&h=533); 前言 作为一名PHP程序员,我感到荣幸。但在时代不断的变迁中,要具备足够的知识才可生存。 那就从Go语言学起把。 ...

    leanxi 评论0 收藏0
  • PHPer面试指南-Laravel

    摘要:简述的生命周期采用了单一入口模式,应用的所有请求入口都是文件。分发请求一旦应用完成引导和所有服务提供者都注册完成,将会移交给路由进行分发。此外,由于对动态方法的独特用法,也使测试起来非常容易。 本书的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作为现在最流行的 PHP 框架,其中的知识较多,所以单独拿出来写一篇。 简述 La...

    alaege 评论0 收藏0
  • Laravel 5 系列教程二:路由,视图,控制器工作流程

    摘要:但是不用担心,我们后续的教程会陆续讲解相关的内容。所以上面的路由注册其实就是负责解决访问的时候的响应。 原文来自:https://jellybool.com/post/programming-with-laravel-5-routers-views-controllers-workflow 免费视频教程地址 https://laravist.com/series/laravel-5-b...

    awesome23 评论0 收藏0
  • laravel框架应用和composer扩展包开发

    摘要:官方地址是目前最流行的框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,框架思想前卫,跟随时代潮流,提倡优雅代码,自称为工匠,其中的模板引擎容器以及扩展包为业务的开发提供了极大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,lara...

    shevy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<