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–路由篇 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
Original url: Access
Created at: 2018-12-19 13:40:24
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论