Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[platform-play] TwirlCompiler support for dependency injection with templates

Abierto
#83 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
scala
Área
build-system

Línea de trabajo

Comienza con el punto de entrada de TwirlCompiler y la configuración sugerida de sourceSets en build.gradle, utilizando como comportamiento de referencia el ejemplo vinculado de inyección de dependencias de Scala templates. La clase de template generada debe aceptar dependencias del constructor y llevar la anotación configurada @javax.inject.Inject(), permitiendo que los controladores la inyecten y la invoquen como se muestra.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Twirl templates can be generated as a class rather than a static object by declaring a constructor using a special @this(args) syntax at the top of the template. This means that Twirl templates can be injected into controllers directly and can manage their own dependencies, rather than the controller having to manage dependencies not only for itself, but also for the templates it has to render.

Reference: https://www.playframework.com/documentation/2.6.x/ScalaTemplatesDependencyInjection

Expected Behavior

Using the examples in reference site:

trait Summarizer {
  /** Provide short form of string if over a certain length */
  def summarize(item: String)
}

Template:

@this(summarizer: Summarizer)
@(item: String)

@{summarizer.summarize(item)}

Controller:

class MyController @Inject()(template: views.html.IndexTemplate, 
                              cc: ControllerComponents) 
  extends AbstractController(cc) {
  
  def index = Action { implicit request =>
    val item = \"some extremely long text\"
    Ok(template(item))
  }
}

The generated class should be:

class IndexTemplate @javax.inject.Inject() /*2.18*/(summarizer: models.Summarizer) extends _root_.play.twirl.api.BaseScalaTemplate[play.twirl.api.HtmlFormat.Appendable,_root_.play.twirl.api.Format[play.twirl.api.HtmlFormat.Appendable]](play.twirl.api.HtmlFormat) with _root_.play.twirl.api.Template1[String,play.twirl.api.HtmlFormat.Appendable] {

  /**/
  def apply/*3.14*/(item: String):play.twirl.api.HtmlFormat.Appendable = {
    _display_ {
      {


Seq[Any](format.raw/*3.28*/("""

            """),_display_(/*5.14*/{summarizer.summarize(item)}),format.raw/*5.42*/("""
        """))
      }
    }
  }

  def render(item:String): play.twirl.api.HtmlFormat.Appendable = apply(item)

  def f:((String) => play.twirl.api.HtmlFormat.Appendable) = (item) => apply(item)

  def ref: this.type = this

}

So the class generated is annotated with @Inject class IndexTemplate @javax.inject.Inject() /*2.18*/(summarizer: models.Summarizer)

Current Behavior

The current version of gradle-plataform-play does not support dependency injection.

Suggestions
Configuration
  • build.gradle
        sourceSets {
                main {
                    twirl{
                        constructorAnnotations = [ '@javax.inject.Inject()']
                    }
                }
            }
Lenguaje dominante
Java
Estrellas
47
Forks
42
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de gradle/playframework

Todos los issues de gradle/playframework

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.