Skip to content

バリデーション実装 ​

リクエストパラメータのバリデーションを実装します。

cf.

事前準備 ​

  • validatorパッケージをインストールします:
shell
go get github.com/go-playground/validator/v10

実装 ​

下記以外は標準ライブラリ使用時の実装に従います。

internal/validation ​

バリデータを実装します。

  • validator.go
go
package validation

import (
	"github.com/go-playground/validator/v10"
)

type CustomValidator struct {
	validator *validator.Validate
}

func NewCustomValidator() *CustomValidator {
	return &CustomValidator{validator: validator.New()}
}

func (cv *CustomValidator) Validate(i any) error {
	if err := cv.validator.Struct(i); err != nil {
		return err
	}
	return nil
}

internal/bootstrap/ ​

  • server.go

バリデータを初期化するため下記を宣言します:

go
	e := echo.New()
	e.Validator = validation.NewCustomValidator()

internal/presentation/handler/model ​

validateタグを用いてバリデーションを宣言し、c.Validateで値の検証を行います。

  • user_model.go
go
type loginRequest struct {
	Name     string `json:"name" example:"nob"`                            // ユーザ名
	Password string `json:"password" example:"passwd" validate:"required"` // パスワード
}

func NewLoginRequest(c *echo.Context) (loginRequest, error) {

	req := new(loginRequest)
	if err := c.Bind(req); err != nil {
		return loginRequest{}, errors.New("invalid request")
	}
	if err := c.Validate(req); err != nil {
		return loginRequest{}, apperrors.NewValidationError(err)
	}

	return *req, nil
}

internal/presentation/handler ​

NewLoginRequestからバリデーションエラーが返ってきた場合、そのエラーをAPIレスポンスとして返します。

  • user_handler.go
go
	req, err := model.NewLoginRequest(c)
	if err != nil {
		return c.JSON(httperror.ToHttpErrorResponse(err))
	}