首页 > 解决方案 > Play Framework 将 val 放入 Action Builder Scala

问题描述

我有自定义 Action Builder,它必须检查我的 val 是否正确

class CheckAction @Inject()(parser: BodyParsers.Default)(implicit ec: ExecutionContext) extends ActionBuilderImpl(parser) {
    override def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]) = {
    if (Base16.decode( HERE I NEED MY VAL).isSuccess) block(request) else resolve(Results.Forbidden)
  }
}

我的路线是这样的

GET        /api/block/:id      controllers.BlockController.findBlockApi(id: String)

控制器是

def findA(id: String): Action[AnyContent] = checkAction(id) {
....

那么我怎样才能把我的 :id 从路由放到我的自定义操作构建器中呢?

标签: playframework

解决方案


寻找答案。1) 动作生成器:

class Base16CheckAction(parser: BodyParsers.Default, modifierId: String) extends ActionBuilderImpl(parser) {
   override def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] =
   if (Base16.decode(modifierId).isSuccess) block(request) else resolve(Results.BadRequest)
}

class Base16CheckActionFactory @Inject()(parser: BodyParsers.Default) {
  def apply(modifierId: String): Base16CheckAction = new Base16CheckAction(parser, modifierId)
}

2) 控制器:

@Inject(base16Check: Base16CheckActionFactory...)
def findHeaderView(id: String): Action[AnyContent] = base16Check(id).async {
....

推荐阅读