Как разделить маршруты GO Gorilla Mux на 2 отдельных файла одного пакета

У меня есть отдельный файл route.go (маршруты пакетов), где я храню все свои маршруты и обработчики. Но я хочу разделить этот файл на 2 файла. Я хочу переименовать свой route.go в main.go и создать новый дополнительный файл moduleX.go (маршруты пакетов). Как я могу это сделать? Я хочу хранить все свои маршруты в нескольких файлах одних и тех же «пакетных маршрутов».

package routes

import (
	"github.com/gorilla/mux"
	"net/http"
	"github.com/---/001/models"
	"github.com/---/001/sessions"
	"github.com/---/001/utils"
	"github.com/---/001/middleware"
)

func NewRouter() *mux.Router {
	r := mux.NewRouter()
	r.HandleFunc("/", middleware.AuthRequired(indexGetHandler)).Methods("GET")
	r.HandleFunc("/", middleware.AuthRequired(indexPostHandler)).Methods("POST")
	r.HandleFunc("/signup", signupGetHandler).Methods("GET")
	r.HandleFunc("/signup", signupPostHandler).Methods("POST")
	r.HandleFunc("/signin", signinGetHandler).Methods("GET")
	r.HandleFunc("/signin", signinPostHandler).Methods("POST")
	r.HandleFunc("/signout", signoutGetHandler).Methods("GET")
	r.HandleFunc("/services", middleware.AuthRequired(servicesHandler)).Methods("GET")
	fs := http.FileServer(http.Dir("./static/"))
	r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
	return r
}

Я хочу переместить все маршруты и обработчики "/signup" и "/signin" за пределы этого основного файла. А потом как-то передать их обратно в эту функцию NewRouter. Вы можете предоставить мне просто книгу или какой-нибудь онлайн-пример.


person Dzintars    schedule 04.02.2018    source источник


Ответы (1)


Для этого вы можете использовать другую функцию, которая модифицирует маршрутизатор.

//In another file
func addSignHandler(r *mux.Router) {
    r.HandleFunc("/signup", signupGetHandler).Methods("GET")
    r.HandleFunc("/signup", signupPostHandler).Methods("POST")
    r.HandleFunc("/signin", signinGetHandler).Methods("GET")
    r.HandleFunc("/signin", signinPostHandler).Methods("POST")
    r.HandleFunc("/signout", signoutGetHandler).Methods("GET")
}

И использовать его:

func NewRouter() *mux.Router {
    r := mux.NewRouter()
    r.HandleFunc("/", middleware.AuthRequired(indexGetHandler)).Methods("GET")
    r.HandleFunc("/", middleware.AuthRequired(indexPostHandler)).Methods("POST")

    addSignHandler(r)

    r.HandleFunc("/services", middleware.AuthRequired(servicesHandler)).Methods("GET")
    fs := http.FileServer(http.Dir("./static/"))
    r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
    return r
}

Или, что еще лучше, вы можете реорганизовать свой код, чтобы сделать его более последовательным:

func addMainHandler(r *mux.Router) {
    r.HandleFunc("/", middleware.AuthRequired(indexGetHandler)).Methods("GET")
    r.HandleFunc("/", middleware.AuthRequired(indexPostHandler)).Methods("POST")
    r.HandleFunc("/services", middleware.AuthRequired(servicesHandler)).Methods("GET")
    fs := http.FileServer(http.Dir("./static/"))
    r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
}

И упростите NewRouter до:

func NewRouter() *mux.Router {
    r := mux.NewRouter()
    addMainHandler(r)
    addSignHandler(r)
    return r
}
person leaf bebop    schedule 04.02.2018
comment
Ура!! Спасибо! Я был очень близок к этому решению! Огромное спасибо. К сожалению, я не могу проголосовать за этот ответ. - person Dzintars; 05.02.2018
comment
Потрясающий. Спасибо, что нашли время ответить. - person Danniel Rolfe; 15.11.2019