LINUX.ORG.RU

Actions в play 2.6

 ,


0

3

Всем привет.

В Play framework 2.6 сильно перелопатили Action Compositions. Не могу врубиться, как теперь корректно создать ActionBuilder. Вот, для примера хочу создать «пустой» ActionBuilder:

AuthAction.scala

package actions

import com.google.inject.{Inject, Singleton}
import scala.concurrent.{Future, ExecutionContext}
import play.api.mvc._
import play.api.mvc.Results._

trait AuthActionT {
  def authenticateAction: ActionBuilder[AuthenticatedRequest, AnyContent]
}

@Singleton
class AuthAction @Inject() (p: BodyParsers.Default)(implicit ec: ExecutionContext) extends AuthActionT {

  def authenticateAction: ActionBuilder[AuthenticatedRequest, AnyContent] = {
    new ActionBuilder[AuthenticatedRequest, AnyContent] {
      def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]): Future[Result] = {
        if (true) {
          block(new AuthenticatedRequest("", request))
        } else {
          Future.successful(Unauthorized)
        }
      }
    }
  }
}

AuthenticatedRequest.scala

package actions

import play.api.mvc.{Request, WrappedRequest}

class AuthenticatedRequest[A](val a: String, val request: Request[A]) extends WrappedRequest[A](request)

Но это не работает - куча отладочного НЕХ'а.

Кто-нибудь может поделиться примером корректно работающего actionBuilder'a для Play 2.6.x или подсказть, что не так с кодом?

Заранее спасибо.



Последнее исправление: djnoob (всего исправлений: 1)

Я помню, ты с Джанги начинал. А теперь то пэхапэ, то скала. Пошел по наклонной?
P.S. оффтопик, но вы ж «личку» пилить не хотите.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Я отталкиваюсь от задачи. Для некоторых задач болье подходят одни инструемнты, к другим - иные.

P.S. А личку, кстати, ты сам можешь записть, сырцы лора (кстати на Scala'е опять же) открыты - дерзай.

djnoob
() автор топика
Ответ на: комментарий от djnoob

А личку, кстати, ты сам можешь записть, сырцы лора (кстати на Scala'е опять же) открыты - дерзай.

Угу. Жаль, Скалку не знаю и не хочу, а то сразу бы взялся.

Virtuos86 ★★★★★
()

Посмотрел в код, у нас какой-то навороченный вариант с implicit классами и type lambda. Могу его показать, если не боишься.

Или скажи что у тебя за ошибка возникает.

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Спасибо, но я, вроде, победил проблему. Рабочий кастомный ActionBuilder:

package actions

import com.google.inject.{Inject, Singleton}
import scala.concurrent.{Future, ExecutionContext}
import play.api.mvc._


class AuthAction @Inject() (val parser: BodyParsers.Default)(implicit val ec: ExecutionContext) extends ActionBuilder[AuthenticatedRequest, AnyContent] {
  def executionContext = ec
  override def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]): Future[Result] = {
    if (true) {
      block(new AuthenticatedRequest("Hello, LOR!", request))
    } else {
      Future.successful(Results.Unauthorized)
    }
  }
}

djnoob
() автор топика
Ответ на: комментарий от djnoob

а оно точно работает для парсеров отличных от Default'а? У тебя в сигнатуре AnyContent, который только он возвращает

maxcom ★★★★★
()
Последнее исправление: maxcom (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.