Passing Arguments to Request Handlers
When working with Gorilla Mux, many developers encounter the limitation of passing arguments directly to handlers. The HandleFunc method only accepts a closure as the second parameter, which limits the number of parameters that can be passed to the handler.
Globally Accessible Database Object
One common solution is to use a globally accessible database object. While this approach is often acceptable, some developers prefer to avoid global variables for various reasons, such as maintainability and testability concerns.
Middleware
Middleware is a mechanism that allows developers to intercept and process requests before they reach the handler. A possible workaround is to create a middleware function that adds the database object to the request context. This middleware can then be used to inject the database into the handler.
For instance:
package main import ( "fmt" "net/http" "github.com/gorilla/mux" "gorm.io/gorm" ) func main() { db := createDB() mux := mux.NewRouter() mux.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Add the database object to the request context r.Context() = context.WithValue(r.Context(), "db", db) // Pass the request to the next handler next.ServeHTTP(w, r) }) }) mux.HandleFunc("/users/{id}", showUserHandler).Methods("GET") } func showUserHandler(w http.ResponseWriter, r *http.Request) { // Retrieve the database object from the request context db := r.Context().Value("db").(*gorm.DB) fmt.Fprintf(w, "We should fetch the user with id %s", mux.Vars(r)["id"]) }
Wrapper Functions
Another workaround is to create wrapper functions that accept the additional parameters. For example:
db := createDB() mux := mux.NewRouter() mux.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) { showUserHandler(w, r, db) }).Methods("GET")
Conclusion
There are several approaches to passing arguments to request handlers in Gorilla Mux, including using middleware and creating wrapper functions. The best approach will depend on the specific requirements and preferences of the developer.
The above is the detailed content of How can I pass arguments to request handlers in Gorilla Mux?. For more information, please follow other related articles on the PHP Chinese website!