Views

Introduction

Of course, it's not practical to return entire HTML document strings directly from your routes and controllers. Thankfully, views provide a convenient way to place all of our HTML in separate files. Views separate your controller / application logic from your presentation logic and are stored in the resources/views directory.

Creating & Rendering Views

When using the Goravel default template html/template, you can create views by adding a file with the .tmpl extension in the application resources/views directory.

// resources/views/welcome.tmpl
{{ define "welcome.tmpl" }}
<html>
  <body>
  <h1>Hello, {{ .name }}</h1>
  </body>
</html>
{{ end }}

After creating the view, you can use the View method to return the view from a route or controller in the application:

facades.Route().Get("/", func(ctx http.Context) http.Response {
  return ctx.Response().View().Make("welcome.tmpl", map[string]any{
    "name": "Goravel",
  })
})

Nested View Directories

Views may also be nested within subdirectories of the resources/views directory. For example, if your view is stored at resources/views/admin/profile.tmpl, you can return it from one of your application's routes or controllers, note that the view needs to be defined as define "admin/profile.tmpl" as shown below:

// resources/views/admin/profile.tmpl
{{ define "admin/profile.tmpl" }}
<h1>Welcome to the Admin Panel</h1>
{{ end }}

ctx.Response().View().Make("admin/profile.tmpl", map[string]any{
  "name": "Goravel",
})

Creating The First Available View

Using the First method, you can use the first view that exists in a given array of views. This may be useful if your application or package allows views to be customized or overwritten:

ctx.Response().View().First([]string{"custom/admin.tmpl", "admin.tmpl"}, map[string]any{
  "name": "Goravel",
})

Determining If A View Exists

If you need to determine if a view exists, you can use the facades.View() method:

if facades.View().Exist("welcome.tmpl") {
  // ...
}

Passing Data To Views

As you saw in the previous examples, you may pass an array of data to views to make that data available to the view. Please note, the format of the passed data needs to change according to the template driver used, in the following example, using the default html/template driver:

facades.Route().Get("/", func(ctx http.Context) http.Response {
  return ctx.Response().View().Make("welcome.tmpl", map[string]any{
    "name": "Goravel",
  })
})

Sharing Data With All Views

Occasionally, you may need to share data with all views that are rendered by your application. You may do so using the Share method in facades.View(). Typically, you should place calls to the Share method within a service provider's Boot method. You are free to add them to the app/providers/app_service_provider.go class or generate a separate service provider to house them:

package providers

import (
	"github.com/goravel/framework/contracts/foundation"
    "github.com/goravel/framework/facades"
)

type AppServiceProvider struct {
}

func (receiver *AppServiceProvider) Register(app foundation.Application) {
}

func (receiver *AppServiceProvider) Boot(app foundation.Application) {
    facades.View().Share("key", "value")
}