php larvael,从PHP Laravel 到 Go Iris--路由篇

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框架的路由基本比较和应用就这些了,还有一些比如控制器路由和如何自定义中间件等在后续再写吧,或者请自行查阅文档,以上内容如有错误请指出。

如果觉得本篇文章对您十分有益,何不 打赏一下

52d8bc8e0f8fdd8b944be5b799892e7f.png

好的,您可以使用Python的Matplotlib库来绘制折线图,具体代码如下: ```python import matplotlib.pyplot as plt import numpy as np # 数据 data = ['Iris-setosa', 'Iris-virginica', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-virginica', 'Iris-setosa', 'Iris-setosa', 'Iris-virginica', 'Iris-versicolor', 'Iris-virginica', 'Iris-versicolor', 'Iris-virginica', 'Iris-setosa', 'Iris-versicolor', 'Iris-virginica', 'Iris-setosa', 'Iris-setosa', 'Iris-virginica', 'Iris-versicolor', 'Iris-versicolor', 'Iris-setosa', 'Iris-virginica', 'Iris-virginica', 'Iris-versicolor', 'Iris-virginica', 'Iris-versicolor', 'Iris-virginica', 'Iris-versicolor', 'Iris-versicolor', 'Iris-setosa', 'Iris-versicolor', 'Iris-versicolor', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-virginica', 'Iris-versicolor', 'Iris-virginica', 'Iris-setosa', 'Iris-versicolor', 'Iris-virginica', 'Iris-virginica', 'Iris-virginica', 'Iris-setosa'] # 统计各类别数量 setosa_count = data.count('Iris-setosa') versicolor_count = data.count('Iris-versicolor') virginica_count = data.count('Iris-virginica') # 构造 x, y 坐标轴数据 categories = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'] values = [setosa_count, versicolor_count, virginica_count] # 绘制折线图 plt.plot(categories, values) # 设置图表标题和坐标轴标签 plt.title('Iris Categories') plt.xlabel('Categories') plt.ylabel('Count') # 显示图表 plt.show() ``` 运行代码后,会得到以下折线图: ![折线图](https://i.imgur.com/B2KmBb6.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值