Play Framework 2.2.0 - 필터 및 전역 객체를 사용하여 언어를 강요합니다.
-
22-12-2019 - |
문제
응용 프로그램의 호스트 이름에 따라 로켈을 요청 객체로 강제로 강제로 설정했습니다.이것은 구성 맵을 읽음으로써 수행됩니다
package controllers
import play.api.mvc._
import play.api.i18n.Lang
import play.api.Play.current
import scala.actors.Future
object Global extends WithFilters(ForceLocalization)
object ForceLocalization extends Filter {
override def apply(next: (RequestHeader) => Future[SimpleResult])
(rh: RequestHeader): Future[SimpleResult] = {
val arr = models.DomainSettings.forDomain(rh.domain).locale.split("_") // -> "en_US"
val language = arr(0) // -> "en"
val country = if ( arr.length == 1 ) "" else arr(1) // -> "US"
f(rh).map( _.withLang(Lang(language, country)) )
}
}
.
코드는 컴파일되지 않습니다.그것은 말한다 :
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
.
모든 제안?
주의 사항 : 내 목표를 달성하기 위해 나쁜 접근 방식을 사용했을 수도 있으므로, 제안하는 것이 더 나은 것이 있다면, 당신의 조언을 기쁘게 생각합니다.
해결책
ymmm - PlainResult
에서 SimpleResult
에서 PLAY의 전환과 관련된 버그를 누르는 것 같습니다.
2.2.0 코드베이스를 볼 때 PlainResult
는 다음과 같습니다.
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
.
및 SimpleResult
는 다음과 같이 정의됩니다 :
case class SimpleResult(...) extends PlainResult
.
... WithHeaders
메소드가 PlainResult
를 리턴하는 것을 의미합니다.
2.2.x 코드베이스의 github recified :
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
.
... 릴리스 후보를 사용하는 것이 기쁘게 생각하는 경우 릴리스 노트 .
그렇지 않은 경우, 헬퍼 메소드를 사용하여 문제를 해결하십시오.
object ForceLocalization extends Filter {
override def apply(next: (RequestHeader) => Future[SimpleResult])
(rh: RequestHeader): Future[SimpleResult] = {
...
next(rh).map( withLang(_, Lang(language, country)) )
}
private def withLang(sr:SimpleResult, lang:Lang) = {
sr.withCookies(Cookie(Play.langCookieName, lang.code))
}
}
. 제휴하지 않습니다 StackOverflow