Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I am planning to implement Auto Validation #4199

Open
Linde7777 opened this issue Jun 20, 2024 · 3 comments
Open

I am planning to implement Auto Validation #4199

Linde7777 opened this issue Jun 20, 2024 · 3 comments

Comments

@Linde7777
Copy link

Linde7777 commented Jun 20, 2024

Related issue(but stale): #3167

I am planning to implement such feature.

Is your feature request related to a problem? Please describe.
Current auto validation rules is not enough.

Describe the solution you'd like
Imitating Gin's validator implementation.
There is a tag "binding", once you add that tag to the struct, when you call Bind()-like function(in go-zero, it is httpx.Parse()), it will automatically validate the struct's fields.
Gin underlying using the go-playground's validator, it has many validation rules, and also support custom validation rule.

Describe alternatives you've considered
Currently I have no alternatives for auto validation

Additional context
In Gin's implementation, the validation's interface has such function: Validate(obj any) error, and in go-zero, the validation interface's function is Validate() error, I not sure which I should use

@Linde7777 Linde7777 changed the title Auto Validation Planning to implement Auto Validation Jun 22, 2024
@Linde7777 Linde7777 changed the title Planning to implement Auto Validation I am planning to implement Auto Validation Jun 22, 2024
@chenquan
Copy link
Member

reference:

func init() {
	uni := ut.New(zh.New())
	trans, _ := uni.GetTranslator("zh")

	v := validator.New()
	logx.Must(zh_translations.RegisterDefaultTranslations(v, trans))

	httpx.SetValidator(&validate{validate: v})
}

type validate struct {
	validate *validator.Validate
}

func (v *validate) Validate(r *http.Request, data any) error {
	return v.validate.StructCtx(r.Context(), data)
}

@Linde7777
Copy link
Author

Linde7777 commented Jun 27, 2024

Is the code you provided a suggestion for implementation?

I noticed that there are two interface:

// [email protected]/rest/httpx/requests.go 

// Validator defines the interface for validating the request.
type Validator interface {
	// Validate validates the request and parsed data.
	Validate(r *http.Request, data any) error
}
// [email protected]/core/validation/validator.go

// Validator represents a validator.
type Validator interface {
	// Validate validates the value.
	Validate() error
}

I’m curious about why there are two different interfaces. Could you please explain?

@chenquan
Copy link
Member

chenquan commented Jun 27, 2024

Yes, just choose one of the two.

if valid, ok := v.(validation.Validator); ok {
return valid.Validate()
} else if val := validator.Load(); val != nil {
return val.(Validator).Validate(r, v)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants