web-dev-qa-db-fra.com

Comment passer des arguments à mon gestionnaire

J'essaie de transmettre mon objet de base de données à mes gestionnaires, au lieu d'avoir un objet global. Mais je ne sais pas si c'est possible, j'utilise le package Gorilla Mux, et je peux voir qu'il faut une fermeture comme deuxième paramètre.

// https://github.com/gorilla/mux/blob/master/mux.go#L174
// HandleFunc registers a new route with a matcher for the URL path.
// See Route.Path() and Route.HandlerFunc().
func (r *Router) HandleFunc(path string, f func(http.ResponseWriter,
    *http.Request)) *Route {
    return r.NewRoute().Path(path).HandlerFunc(f)
}

Qui définit ensuite les paramètres que je peux utiliser, idéalement, je voudrais avoir un troisième paramètre comme celui-ci.

// In my main
router.HandleFunc("/users/{id}", showUserHandler).Methods("GET")

func showUserHandler(w http.ResponseWriter, r *http.Request, db *gorm.DB) {
    fmt.Fprintf(w, "We should fetch the user with id %s", vars["id"])
}

Y at-il un travail autour? Ou ai-je besoin d'un objet db global? Je suis nouveau sur Go, veuillez donc expliquer en détail une réponse potentielle.

27
MartinElvar

Bienvenue chez Go.

Il est acceptable d'avoir des variables globales et spécialement des objets de base de données.

Cependant, il existe plusieurs façons de contourner ce problème si vous préférez ne pas le faire, par exemple, vous pouvez créer une structure et y définir votre showHandler.

type Users struct {
    db *gorm.DB
}

func (users *Users) showHandler(w http.ResponseWriter, r *http.Request) {
    //now you can use users.db
}
func (users *Users) addHandler(w http.ResponseWriter, r *http.Request) {
    //now you can use users.db
}

// setup
users := &Users{db: createDB()}
router.HandleFunc("/users/{id}", users.showHandler).Methods("GET")
router.HandleFunc("/users/new", users.addHandler)
//etc

Une autre approche consiste à créer une fonction wrapper:

db := createDB()
router.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
    showUserHandler(w, r, db)
}).Method("GET")
55
OneOfOne