リクエスト ハンドラーに引数を渡す
Gorilla Mux を使用する場合、多くの開発者は引数をハンドラーに直接渡すという制限に遭遇します。 HandleFunc メソッドは 2 番目のパラメータとしてクロージャのみを受け入れます。これにより、ハンドラに渡すことができるパラメータの数が制限されます。
Globally Accessible Database Object
1 つの共通解決策は、グローバルにアクセス可能なデータベース オブジェクトを使用することです。このアプローチは多くの場合許容されますが、保守性やテスト容易性への懸念など、さまざまな理由からグローバル変数を避けることを好む開発者もいます。
ミドルウェア
ミドルウェアは、次のことを可能にするメカニズムです。開発者は、リクエストがハンドラーに到達する前にインターセプトして処理できるようになります。考えられる回避策は、データベース オブジェクトをリクエスト コンテキストに追加するミドルウェア関数を作成することです。このミドルウェアを使用してデータベースをハンドラーに挿入できます。
例:
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"]) }
ラッパー関数
別の回避策は次のとおりです。追加のパラメータを受け入れるラッパー関数を作成します。例:
db := createDB() mux := mux.NewRouter() mux.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) { showUserHandler(w, r, db) }).Methods("GET")
結論
Gorilla Mux のリクエスト ハンドラーに引数を渡すには、ミドルウェアの使用やラッパー関数の作成など、いくつかの方法があります。最適なアプローチは、開発者の特定の要件と好みによって異なります。
以上がGorilla Mux のリクエスト ハンドラーに引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。