L'une de mes caractéristiques préférées de Go est la possibilité d'ajouter facilement des gestionnaires à l'intérieur des paquets. Cela simplifie grandement le processus d'écriture de code modulaire.
Par exemple :
Structure du fichier
|-- app.yaml
|-- app
| +-- http.go
|-- templates
| +-- base.html
+-- github.com
+-- storeski
+-- appengine
|-- products
| |-- http.go
| +-- templates
| |-- list.html
| +-- detail.html
+-- account
|-- http.go
+-- templates
|-- overview.html
+-- notifications.html
Chaque paquet a un fichier http.go qui prend en charge un préfixe url. Par exemple, le fichier products
paquet sous github.com/storeski/appengine/products
posséderait toute url entrante commençant par /products
.
Avec cette approche modulaire, il est avantageux de stocker les modèles au sein de l'arborescence de l'entreprise. products
paquet. Si vous souhaitez conserver un modèle de base cohérent pour le site, vous pouvez établir une convention dans laquelle vous étendez les éléments suivants templates/base.html
.
Exemple
modèles/base.html
<!DOCTYPE HTML>
<html>
<head>
<title>{{.Store.Title}}</title>
</head>
<body>
<div id="content">
{{template "content" .}}
</div>
</body>
</html>
github.com/storeski/appengine/produits/templates/list.html
{{define "content"}}
<h1> Products List </h1>
{{end}}
github.com/storeski/appengine/produits/http.go
func init() {
http.HandleFunc("/products", listHandler)
}
var listTmpl = template.Must(template.ParseFiles("templates/base.html",
"github.com/storeski/appengine/products/templates/list.html"))
func listHandler(w http.ResponseWriter, r *http.Request) {
tc := make(map[string]interface{})
tc["Store"] = Store
tc["Products"] = Products
if err := listTmpl.Execute(w, tc); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
Cette approche est très intéressante car elle rend le partage des applications/paquets trivial. Si j'écris un paquet qui s'occupe de l'authentification et qui prend la propriété de l'application /auth
url. Tout développeur qui ajoute ensuite le paquet à son produit Root dispose instantanément de toutes les fonctionnalités. Tout ce qu'il a à faire est de créer un modèle de base ( templates/base.html
) et dirigent leurs utilisateurs vers /auth
.