logo Buffalo slack logo
Contexto
Gestión de Peticiones

Contexto

En el corazón de cada gestor de peticiones de Buffalo se encuentra el contexto. Este contexto proporciona a los controladores una definición de función simple y limpia, a la vez que es inmensamente potente.

La interfaz context

La interfaz buffalo.Context soporta context.Context por lo que se puede pasar y utilizar como un Contexto de Go “estándar”.

Dado que buffalo.Context es una interfaz, es posible crear una implementación específica para la aplicación que se adapte a las necesidades de la aplicación que se está construyendo.

Desde 0.12.0
type Context interface {
	context.Context
	Response() http.ResponseWriter
	Request() *http.Request
	Session() *Session
	Cookies() *Cookies
	Params() ParamValues
	Param(string) string
	Set(string, interface{})
	LogField(string, interface{})
	LogFields(map[string]interface{})
	Logger() Logger
	Bind(interface{}) error
	Render(int, render.Renderer) error
	Error(int, error) error
	Redirect(int, string, ...interface{}) error
	Data() map[string]interface{}
	Flash() *Flash
	File(string) (binding.File, error)
}

La función Websocket() (*websocket.Conn, error) fue eliminada de buffalo.Context en la versión v0.12.0. Utiliza el paquete http://www.gorillatoolkit.org/pkg/websocket en su lugar.

Contexto y renderizado

Como parte de la interfaz del contexto, hay una función Render que toma un tipo de render.Renderer. Revisa rendering para mayor información.

Cualquier valor que sea definido en el contexto estará automáticamente disponible para el render.Renderer que se pasa a la función Render.

func Hello(c buffalo.Context) error {
  c.Set("name", "Mark")

  return c.Render(http.StatusOK, render.String("Hi <%= name %>"))
}

Implementando la Interfaz

El buffalo.Context no está pensado para ser implementado “totalmente”. En su lugar, se recomienda utilizar una composición y utilizar sólo las funciones de las que se desea proporcionar implementaciones personalizadas.

A continuación se muestra un ejemplo de cambio de la función Error para registrar el error y matar la aplicación:

// actions/context.go
type MyContext struct {
  buffalo.Context
}

func (my MyContext) Error(status int, err error) error {
  my.Logger().Fatal(err)
  return err
}
// actions/app.go
// ...
func App() *buffalo.App {
  if app != nil {
    // ...
    app.Use(func (next buffalo.Handler) buffalo.Handler {
      return func(c buffalo.Context) error {
      // change the context to MyContext
      return next(MyContext{c})
      }
    })
    // ...
  }
  return app
}
// ...

Recorriendo los Parámetros

El método buffalo.Context#Params devuelve buffalo.ParamValues que es una interfaz alrededor de url.Values. Se puede hacer un casting a este tipo en el handler para recorrer los valores de los parámetros.

import "net/url"

func HomeHandler(c buffalo.Context) error {
  if m, ok := c.Params().(url.Values); ok {
    for k, v := range m {
      fmt.Println(k, v)
    }
  }

  return c.Render(http.StatusOK, r.HTML("index.html"))
}

Qué hay en el contexto

Buffalo añade al contexto de cada solicitud un montón de información que podría ser útil en tu aplicación, como la current_route o la session. A continuación se muestra una lista de lo que Buffalo añade al contexto de cada solicitud al que puedes acceder desde las acciones o plantillas.

Llave Tipo Uso
app *buffalo.App La aplicación actual de Buffalo que se está ejecutando.
env string El entorno actual en el que se ejecuta la aplicación. Por ejemplo: test, development, production
routes buffalo.RouteList Una lista de todas las rutas mapeadas en la aplicación.
current_route buffalo.RouteInfo La ruta actual a la que se accede.
current_path string La ruta actual solicitada. Ejemplo: /users/1/edit
*Path RouteHelperFunc Helpers para crear caminos basados en las rutas mapeadas. Por ejemplo: editUserPath. Ejecuta buffalo task routes para ver una lista completa para tu aplicación.
params map[string]string Parámetros de consulta de la página solicitada.
flash map[string][]string Un mapa de mensajes establecidos mediante buffalo.Context#Flash.
session *buffalo.Session La sesión del usuario actual.
request *http.Request La petición actual.
tx *pop.Connection Sólo se establece si se utiliza el middleware github.com/gobuffalo/buffalo/middleware.PopTransaction (activado por defecto).

Consulta Helpers para obtener una lista de las funciones de ayuda integradas disponibles dentro de las plantillas.