Skip to content

Commit

Permalink
Merge pull request #3 from chaosannals/main
Browse files Browse the repository at this point in the history
implement php http client generate.
  • Loading branch information
kevwan authored Feb 6, 2025
2 parents 033bc29 + ba6b765 commit d4e7723
Show file tree
Hide file tree
Showing 30 changed files with 768 additions and 1,465 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.idea
.idea
*.exe
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# goctl-php

![go-zero](https://img.shields.io/badge/Github-go--zero-brightgreen?link=https://github.com/tal-tech/go-zero&logo=github)
![go-zero](https://img.shields.io/badge/Github-go--zero-brightgreen?link=https://github.com/zeromicro/go-zero&logo=github)
![License](https://img.shields.io/badge/License-MIT-blue?link=https://github.com/zeromicro/goctl-android/blob/main/LICENSE)
![Go](https://github.com/zeromicro/goctl-android/workflows/Go/badge.svg)

Expand Down Expand Up @@ -60,9 +60,9 @@ goctl-php是一款基于goctl的插件,用于生成 php 调用端(服务端
* 生成php代码

```shell script
$ goctl api plugin -plugin goctl-php="php -package Tal" -api user.api -dir .
$ goctl api plugin -plugin goctl-php="php -namespace Tal" -api user.api -dir .
```
>说明: 其中`goctl-php`为可执行的二进制文件,`"php -package Tal"`为goctl-plugin自定义的参数,这里需要用引号`""`引起来。
>说明: 其中`goctl-php`为可执行的二进制文件,`"php -namespace Tal"`为goctl-plugin自定义的参数,这里需要用引号`""`引起来。

我们来看一下生成php代码后的目录结构
```text
Expand All @@ -77,12 +77,12 @@ goctl-php是一款基于goctl的插件,用于生成 php 调用端(服务端

> [点击这里]() 查看php示例源码

composer依赖
```txt
//TODO
```
> 本插件是基于 php 的 curl 这个 c 扩展来实现http请求,php.ini 文件需要开启此扩展。

> 本插件是基于***来实现http请求,因此会用到一些php依赖,composer包管理形式自行处理。
```ini
; 需要开启这个 c 扩展。
extension=curl
```

* 编写测试
```php
Expand Down
17 changes: 4 additions & 13 deletions action/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,18 @@
package action

import (
"encoding/json"
"io/ioutil"
"os"

"github.com/urfave/cli/v2"
"github.com/zeromicro/go-zero/tools/goctl/plugin"
"github.com/zeromicro/goctl-php/generate"
)

func Php(ctx *cli.Context) error {
pkg := ctx.String("package")
std, err := ioutil.ReadAll(os.Stdin)
if err != nil {
return err
}
ns := ctx.String("namespace")

var plugin generate.Plugin
plugin.ParentPackage = pkg
err = json.Unmarshal(std, &plugin)
plugin, err := plugin.NewPlugin()
if err != nil {
return err
}

return generate.Do(plugin)
return generate.PhpCommand(plugin, ns)
}
87 changes: 0 additions & 87 deletions generate/bean.go

This file was deleted.

54 changes: 0 additions & 54 deletions generate/bean_test.go

This file was deleted.

107 changes: 107 additions & 0 deletions generate/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package generate

import (
"fmt"
"strings"

"github.com/zeromicro/go-zero/tools/goctl/api/spec"
"github.com/zeromicro/goctl-php/template"
"github.com/zeromicro/goctl-php/util"
)

func genClient(dir string, ns string, api *spec.ApiSpec) error {
data := template.PhpTemplateData{
Namespace: ns,
}

if err := template.WriteFile(dir, "ApiBaseClient", template.ApiBaseClient, data); err != nil {
return err
}
if err := template.WriteFile(dir, "ApiException", template.ApiException, data); err != nil {
return err
}
if err := template.WriteFile(dir, "ApiBody", template.ApiBody, data); err != nil {
return err
}
return writeClient(dir, ns, api)
}

func writeClient(dir string, ns string, api *spec.ApiSpec) error {
name := util.CamelCase(api.Service.Name, true)

data := template.PhpApiClientTemplateData{
PhpTemplateData: template.PhpTemplateData{Namespace: ns},
ClientName: name,
Routes: []template.PhpApiClientRouteTemplateData{},
}

for _, g := range api.Service.Groups {
prefix := g.GetAnnotation("prefix")

// 路由
for _, r := range g.Routes {
route := template.PhpApiClientRouteTemplateData{
HttpMethod: strings.ToLower(r.Method),
UrlPath: r.Path,
Prefix: prefix,
ActionPrefix: util.CamelCase(prefix, true),
ActionName: util.CamelCase(r.Path, true),
}

if r.RequestType != nil {
requestType := util.CamelCase(r.RequestType.Name(), true)
route.RequestType = &requestType
route.RequestHasPathParams = hasTagMembers(r.RequestType, pathTagKey)
route.RequestHasQueryString = hasTagMembers(r.RequestType, formTagKey)
route.RequestHasHeaders = hasTagMembers(r.RequestType, headerTagKey)
route.RequestHasBody = hasTagMembers(r.RequestType, bodyTagKey)
}

if r.ResponseType != nil {
responseType := util.CamelCase(r.ResponseType.Name(), true)
route.ResponseType = &responseType

definedType, ok := r.ResponseType.(spec.DefineStruct)
if !ok {
return fmt.Errorf("type %s not supported", responseType)
}
if rh, err := enumResponseSubMessageKey(&definedType, headerTagKey); err != nil {
return err
} else {
route.ResponseHeaders = rh
}
if rb, err := enumResponseSubMessageKey(&definedType, bodyTagKey); err != nil {
return err
} else {
route.ResponseBody = rb
}
}

data.Routes = append(data.Routes, route)
}
}

return template.WriteFile(dir, fmt.Sprintf("%sClient", name), template.ApiClient, data)
}

func enumResponseSubMessageKey(definedType *spec.DefineStruct, tag string) (map[string]string, error) {
// 获取字段
ms := definedType.GetTagMembers(tag)
if len(ms) <= 0 {
return nil, nil
}

result := map[string]string{}

for _, m := range ms {
tags := m.Tags()
k := ""
if len(tags) > 0 {
k = tags[0].Name
} else {
k = m.Name
}
result[util.CamelCase(m.Name, true)] = k
}
return result, nil
}
29 changes: 29 additions & 0 deletions generate/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package generate

import (
"fmt"

"github.com/gookit/color"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/tools/goctl/api/parser"
"github.com/zeromicro/go-zero/tools/goctl/plugin"
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
)

func PhpCommand(p *plugin.Plugin, ns string) error {
api, e := parser.Parse(p.ApiFilePath)
if e != nil {
return e
}

if err := api.Validate(); err != nil {
return err
}

logx.Must(pathx.MkdirIfNotExist(p.Dir))
logx.Must(genMessages(p.Dir, ns, api))
logx.Must(genClient(p.Dir, ns, api))

fmt.Println(color.Green.Render("Done."))
return nil
}
Loading

0 comments on commit d4e7723

Please sign in to comment.