Erstellen Sie einfach statische Methode, die die Logik teilt und es verwenden, die Result
für beide Aktionen bauen es request()
automatisch enthalten, einfachste Beispiel:
public class A extends Controller {
public Result create(String param) {
return shared("A role", param);
}
public static Result shared(String role, String param) {
String msg = "Path: " + request().path();
msg += ", role is: `" + role + "`";
msg += (param == null)
? " and has no param"
: ", with param: " + param;
return ok(msg);
}
}
public class B extends Controller {
public Result create() {
return controllers.A.shared("B role", null);
}
}
Über params
Hinweis dass die einzigen Parameter, die Sie in A.create(...)
und B.create(...)
auflösen müssen, sind die Route Teile (String param
in der A
Route) oder vielleicht einige optionale Parameter im Beispiel hardcoded role
in dem Beispiel.
Andere Dinge, wie request
, session
, cache
, DB-Daten usw. können (sollten) innerhalb des shared()
Verfahren extrahiert werden.
TIPP: Wenn die Anzahl der params an die shared()
Methode zu übergeben erforderlich ist groß und Sie wollen nicht Monster wie
controllers.A.shared(null, null, null, null, null, null, null, null, "foo");
nur erstellen Map<String, Object>
Sammlung erstellen und auf einmal passieren oder dedizierte transiente erstellen Modell, das alle Werte in richtigen Feldern enthält. Die zweite Option ist auch mein Favorit, wenn viele Werte an die üblichen Twirl-Vorlagen übergeben werden.
Nein @Idos, Sie können das nicht tun. Wir sollten die Controller nicht initialisieren, Framework muss das tun. Darüber hinaus, obwohl wir versuchen, können wir Anfrage Parameter an diese Methode übergeben. – prakash