راهاندازی مسیرها
بیایید این بخش را با اضافه کردن پنج مسیر جدید به برنامه خود شروع کنیم، به طوری که به این صورت باشد:
| Route pattern | Handler | Action |
|---|---|---|
| GET /{$} | home | نمایش صفحه اصلی |
| GET /snippet/view/{id} | snippetView | نمایش یک اسنیپت خاص |
| GET /snippet/create | snippetCreate | نمایش فرم ایجاد یک اسنیپت جدید |
| POST /snippet/create | snippetCreatePost | ایجاد یک اسنیپت جدید |
| GET /user/signup | userSignup | نمایش فرم ثبتنام یک کاربر جدید |
| POST /user/signup | userSignupPost | ایجاد یک کاربر جدید |
| GET /user/login | userLogin | نمایش فرم ورود کاربر |
| POST /user/login | userLoginPost | احراز هویت و ورود کاربر |
| POST /user/logout | userLogoutPost | خروج کاربر |
| GET /static/ | http.FileServer | سرو یک فایل استاتیک خاص |
توجه داشته باشید که handlerهای تغییردهنده وضعیت جدید — userSignupPost، userLoginPost و userLogoutPost — همه از درخواستهای POST استفاده میکنند، نه GET.
اگر در حال دنبال کردن هستید، فایل handlers.go خود را باز کنید و placeholderهایی برای پنج تابع handler جدید به این صورت اضافه کنید:
package main ... func (app *application) userSignup(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Display a form for signing up a new user...") } func (app *application) userSignupPost(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Create a new user...") } func (app *application) userLogin(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Display a form for logging in a user...") } func (app *application) userLoginPost(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Authenticate and login the user...") } func (app *application) userLogoutPost(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Logout the user...") }
سپس وقتی که انجام شد، بیایید مسیرهای مربوطه را در فایل routes.go ایجاد کنیم:
package main ... func (app *application) routes() http.Handler { mux := http.NewServeMux() fileServer := http.FileServer(http.Dir("./ui/static/")) mux.Handle("GET /static/", http.StripPrefix("/static", fileServer)) dynamic := alice.New(app.sessionManager.LoadAndSave) mux.Handle("GET /{$}", dynamic.ThenFunc(app.home)) mux.Handle("GET /snippet/view/{id}", dynamic.ThenFunc(app.snippetView)) mux.Handle("GET /snippet/create", dynamic.ThenFunc(app.snippetCreate)) mux.Handle("POST /snippet/create", dynamic.ThenFunc(app.snippetCreatePost)) // Add the five new routes, all of which use our 'dynamic' middleware chain. mux.Handle("GET /user/signup", dynamic.ThenFunc(app.userSignup)) mux.Handle("POST /user/signup", dynamic.ThenFunc(app.userSignupPost)) mux.Handle("GET /user/login", dynamic.ThenFunc(app.userLogin)) mux.Handle("POST /user/login", dynamic.ThenFunc(app.userLoginPost)) mux.Handle("POST /user/logout", dynamic.ThenFunc(app.userLogoutPost)) standard := alice.New(app.recoverPanic, app.logRequest, commonHeaders) return standard.Then(mux) }
در نهایت، همچنین باید partial nav.tmpl را بهروزرسانی کنیم تا آیتمهای ناوبری برای صفحات جدید را شامل شود:
{{define "nav"}}
<nav>
<div>
<a href='/'>Home</a>
<a href='/snippet/create'>Create snippet</a>
</div>
<div>
<a href='/user/signup'>Signup</a>
<a href='/user/login'>Login</a>
<form action='/user/logout' method='POST'>
<button>Logout</button>
</form>
</div>
</nav>
{{end}}
اگر دوست دارید، میتوانید در این مرحله برنامه را اجرا کنید و باید آیتمهای جدید را در نوار ناوبری به این صورت ببینید:
اگر روی لینکهای جدید کلیک کنید، باید با پاسخ متنی placeholder مربوطه پاسخ دهند. به عنوان مثال، اگر روی لینک ‘Signup’ کلیک کنید، باید پاسخی مشابه این ببینید: