动作生成器将在哪个控制器中执行

In which controller will action builder executes

我有动作生成器

  class LoggingAction @Inject()(parser: BodyParsers.Default)(implicit ec: ExecutionContext) extends ActionBuilderImpl(parser) {
     override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = {
        Logger.info(s"Controller = ${},  " +
            s"method = ${request.method},  " +
            s"URI = ${request.uri},  " +
            s"remote-address = ${request.remoteAddress},  " +
            s"domain = ${request.domain}")
       block(request)
    }
   }
  }

我有一些简单的路线,其中之一

...
def index() = loggingAction { implicit request: Request[AnyContent] =>
Ok(views.html.index())
}
...

如何在 LogginAction 中记录在该控制器中执行的 LoggingAction

您可以更改 LoggingAction 的签名以传递当前的 class。

 class LoggingAction @Inject() (controller: AbstractController)(parser: BodyParsers.Default)(implicit ec: ExecutionContext) extends ActionBuilderImpl(parser) {
     override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = {
        Logger.info(s"Controller = ${controller.getClass.getName},  " +
            s"method = ${request.method},  " +
            s"URI = ${request.uri},  " +
            s"remote-address = ${request.remoteAddress},  " +
            s"domain = ${request.domain}")
       block(request)
    }
   }

然后专门为您的控制器创建一个日志操作实例(这可以通过为其创建一个 Guice 工厂来简化)

class TestController @Inject() (cc: ControllerComponents, parser: BodyParsers.Default)(implicit ec: ExecutionContext)
  extends AbstractController(cc) {

  lazy val loggingAction = new LoggingAction(this, parser)

  def index ()= loggingAction { implicit request =>
    Ok(views.html.index())
  }
}