Je suis nouveau dans le framework Play et j'ai essayé d'imiter l'échantillon helloworld sur ma machine locale mais j'ai rencontré une erreur:
routes:
# Home page
GET / controllers.Application.index
# Hello action
GET /hello controllers.Application.sayHello
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
contrôleur:
package controllers
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import views._
class Application extends Controller {
val helloForm = Form(
Tuple(
"name" -> nonEmptyText,
"repeat" -> number(min = 1, max = 100),
"color" -> optional(text)
)
)
def index = Action {
Ok(html.index(helloForm))
}
def sayHello = Action { implicit request =>
helloForm.bindFromRequest.fold(
formWithErrors => BadRequest(html.index(formWithErrors)),
{case (name, repeat, color) => Ok(html.hello(name, repeat.toInt, color))}
)
}
}
voir:
@(helloForm: Form[(String,Int,Option[String])])
@import helper._
@main(title = "The 'helloworld' application") {
<h1>Configure your 'Hello world':</h1>
@form(action = routes.Application.sayHello, args = 'id -> "helloform") {
@inputText(
field = helloForm("name"),
args = '_label -> "What's your name?", 'placeholder -> "World"
)
@inputText(
field = helloForm("repeat"),
args = '_label -> "How many times?", 'size -> 3, 'placeholder -> 10
)
@select(
field = helloForm("color"),
options = options(
"" -> "Default",
"red" -> "Red",
"green" -> "Green",
"blue" -> "Blue"
),
args = '_label -> "Choose a color"
)
<p class="buttons">
<input type="submit" id="submit">
<p>
}
}
J'ai installé Play 2.4 et créé le projet à l'aide d'IntelliJ Idea 14 via le modèle activator.
Après avoir ajouté implicit messages
paramètres aux vues, vous pouvez simplement ajouter les importations suivantes et utiliser les anciennes classes de contrôleur ou même les objets sans aucune modification supplémentaire:
import play.api.Play.current
import play.api.i18n.Messages.Implicits._
L'utilisation des assistants de formulaire de vue (tels que @inputText
) Vous oblige à passer un paramètre implicite play.api.i18n.Messages
À votre vue. Vous pouvez le faire en ajoutant (implicit messages: Messages)
À la signature dans votre vue. Votre point de vue devient ceci:
@(helloForm: Form[(String,Int,Option[String])])(implicit messages: Messages)
@import helper._
@main(title = "The 'helloworld' application") {
<h1>Configure your 'Hello world':</h1>
...
Ensuite, dans votre contrôleur d'application, vous devez rendre ce paramètre implicitement disponible dans votre portée. La façon la plus simple de le faire est d'implémenter le trait I18nSupport
Du jeu.
Dans votre exemple, cela ressemblerait à ceci:
package controllers
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import javax.inject.Inject
import play.api.i18n.I18nSupport
import play.api.i18n.MessagesApi
import views._
class Application @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {
val helloForm = Form(
Tuple(
"name" -> nonEmptyText,
"repeat" -> number(min = 1, max = 100),
"color" -> optional(text)
)
)
def index = Action {
Ok(html.index(helloForm))
}
def sayHello = Action { implicit request =>
helloForm.bindFromRequest.fold(
formWithErrors => BadRequest(html.index(formWithErrors)),
{case (name, repeat, color) => Ok(html.hello(name, repeat.toInt, color))}
)
}
}
Dans votre contrôleur, vous pouvez bien sûr utiliser votre propre implémentation de MessagesApi
. Puisque play sait comment injecter un MessagesApi
, vous pouvez simplement annoter votre contrôleur avec @Inject
Et laisser play faire le travail pour vous.
Comme Matthias Braun l'a mentionné, vous devez également définir
routesGenerator := InjectedRoutesGenerator
dans votre build.sbt
Voir https://www.playframework.com/documentation/2.4.x/ScalaI18N pour plus d'informations sur I18n.
L'utilisation des assistants de formulaire nécessite que vous passiez un paramètre implicite play.api.i18n.Messages
À votre vue. Vous pouvez le faire en ajoutant (implicit messages: Messages)
À votre vue. Votre point de vue devient ceci:
@(contacts: List[models.Contact],
form: Form[models.Contact])(implicit messages: Messages)
Injectez ensuite manuellement dans vos contrôleurs
import play.api.data.Forms._
import javax.inject.Inject
import play.api.i18n.I18nSupport
import play.api.i18n.MessagesApi
puis enfin ajouter à votre classe de contrôleur d'index principal
class Application @Inject()(val messagesApi: MessagesApi) extends
Controller with I18nSupport {