Install the framework and tools
First let's install Goravel. It's a batteries included Go Web Framework for developers familiar with the Laravel Framework.
Steps from Getting started documentation:
// Download framework git clone https://github.com/goravel/goravel.git rm -rf goravel/.git* // Install dependencies cd goravel go mod tidy // Create .env environment configuration file cp .env.example .env // Generate application key go run . artisan key:generate
Now install templ (for html templates) and air (for hot reloading)
go install github.com/a-h/templ/cmd/templ@latest go install github.com/cosmtrek/air@latest
Configure a simple frontend template structure
(work in progress – I will update with global variables and script push)
• Add this line in your /.gitignore file: *_templ.go
• Delete resources/views/welcome.tmpl
• Create 2 folders in resources/views, home and parts
• In the folder resources/views/parts create 3 files:
1. resources/views/parts/header.templ
package parts templ Header() { <h1>Header</h1> }
2. resources/views/parts/footer.templ
package parts templ Footer() { <footer> <p>© 2024 MyProject</p> </footer> }
3. resources/views/parts/template.templ
package parts templ Template() { <!DOCTYPE html> <html> <head> <title>My Page</title> <meta charset="utf-8"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <!-- Your styles go here --> </head> <body> @Header() { children... } @Footer() <!-- Your scripts go here --> <script src="//unpkg.com/alpinejs" defer></script> </body> </html> }
• Create your homepage component: resources/views/home/index.templ
package home import "goravel/resources/views/parts" templ Index() { @parts.Template() { <h1>Homepage</h1> <div>Templ is awesome</div> } }
Their documentation for children components is here. They have an example for a layout structure but I find this method better.
Use this homepage component in your controller
I made this new file app/http/controllers/controller.go where I can store some helpers available to any controller.
package controllers import ( "github.com/a-h/templ" "github.com/goravel/framework/contracts/http" ) func RenderTempl(c http.Context, comp templ.Component) http.Response { c.Response().Status(200) c.Response().Header("Content-Type", "text/html") comp.Render(c, c.Response().Writer()) return nil }
This helper renders the provided templ component in the response buffer along with a 200 status header. My first try at this I was using c.Response().Writer().Header().Set() but is does not work ! The only way to set response headers is c.Response().Header(key, val).
Let's use it in app/http/controllers/home_controller.go
package controllers import ( "goravel/resources/views/home" "github.com/goravel/framework/contracts/http" ) type HomeController struct { //Dependent services } func NewHomeController() *HomeController { return &HomeController{ //Inject services } } func (r *HomeController) Index(ctx http.Context) http.Response { // doing awesome stuff here return RenderTempl(ctx, home.Index()) }
Now set this new route:
package routes import ( "goravel/app/http/controllers" "github.com/goravel/framework/facades" ) func Web() { homeController := controllers.NewHomeController() facades.Route().Get("/", homeController.Index) }
Configure hot reloading with Air
Goravel already comes with the configuration file (.air.toml) you need for this, we only need to add the templ generate command in the cmd parameter, like this:
[build] bin = "./storage/temp/main" - cmd = "go build -o ./storage/temp/main ." + cmd = "templ generate && go build -o ./storage/temp/main ."
If you are using Windows add .exe to main in both bin and cmd parameters:
[build] bin = "./storage/temp/main.exe" cmd = "templ generate && go build -o ./storage/temp/main.exe ."
Done ! Happy coding !