2014-01-18 2 views
0

Play 용 스칼라에서 액션 구성에 대해이 기사 http://www.playframework.com/documentation/2.0.4/ScalaActionsComposition을 읽었지만 아무 것도 그다지 도움이되지 않습니다.사용자 정의 액션을 서로 연결하기

isAuthenticated, isActivatedhasEnoughFunds는 (반드시 트래 이스 플하지만) 특성이다
def about = Action { ... } 

def changePassword = isAuthenticated { x => isActivated { .... } } 

def request = isAuthenticated { x => isActivated { y => hasEnoughFunds { ... } } } 

나 자신을 만들 : 내가 뭘 원하는 진정한 액션 구성,이 같은 것입니다. 아이디어는 거의 모든 사용자 지정 "동작"을 서로 연결하며, 바람직하게는 임의의 순서로 연결합니다.

어떻게하면됩니까?

답변

1

이 시도 : 각 검사 (isAuthenticated, isActivatedhasEnoughFunds)를 들어, 컨트롤러 (AuthenticationCheck, ActivationCheckFundsCheck)에 섞어 특성을 만듭니다. 그런 다음

def onNotActivated(request: RequestHeader): Result = 
    Results.BadRequest("Not activated") 

: 각 특성에 대한

, 기본 동작을 정의, 이것은 기본적으로 ActivationCheck의 경우, 예를 들어, 같은 것을 결과를 RequestHeader에 소요 반환하는 방법 연결하려는 "main"메서드는 기본적으로이 메서드는 위의 코드에서 첫 번째 (x)와 검사가 통과되면 적용 할 함수 두 가지 인수를 취합니다. 기본 메서드는 다음과 같습니다.

def isActivated(x: XX)(f: => XX => Result)(implicit request: Request[AnyContent]): Result = 
    if(checkIfActivated(x)) f(x) else onNotActivated 

S 기본적으로 연결하려는 모든 메서드는 액션을 반환하는 첫 번째 메서드 (여기서는 isAuthenticated)를 제외하고 Result을 반환해야합니다. 또한 모두를 Result으로 반환 한 다음 전체 연결을 Action으로 마무리 할 수 ​​있습니다. 이 도움이

def request = Action { implicit request => 
    isAuthenticated { x => 
    isActivated(x) { y => 
     hasEnoughFunds(y) { z => 
      ... 
     } 
    } 
    } 
} 

희망 :

그런 다음 연결은 다음과 같을 것이다.

+0

글쎄, 맞춤 동작을 추가하거나 다른 순서로 조합하고 싶다면 어떻게해야합니까? –

+0

답변을 업데이트했습니다. 모두 '결과'를 반환하고 전체를 '액션'으로 묶을 수도 있습니다. 그러나 당신이 x, y, z 모든 수퍼 클래스를 만들지 않는다면 당신이 원하는 순서대로 그들을 섞을 수는 없습니다.하지만 다시 그들의 타입을 확인해야합니다. – Peter

관련 문제