Play 2.3:创建抽象控制器来管理表单是否有意义?
Play 2.3: Is there a point to creating an abstract controller to manage forms?
我正在创建一个基于 Play Framework 2.3 的应用程序,我想将它拆分成多个模块。提交表单时,调用的操作几乎总是做同样的事情,就像:
public final Result submit() {
Result result = null;
Form<Something> boundForm = form.bindFromRequest();
if (boundForm.hasErrors()) {
potentiallyDoSomething();
result = badRequest(sometemplate.render(boundForm));
} else {
potentiallyDoSomethingWith(boundForm.get());
result = redirect(route.Application.somewhere());
}
return result;
}
所以,我想知道在抽象控制器中提取这种通用行为是否明智。我想出了一些我发现 questionable.
也许我完全不适应了。
感谢任何建议。
嗯,你当然可以这样做。你可以有这样的东西:
public abstract class BaseController<T> extends Controller {
abstract Html onFail(Form<T> form);
abstract Call onSuccess(T elem);
public Result submit(Class<T> clazz){
Form<T> boundForm = form(clazz).bindFromRequest();
if (boundForm.hasErrors()) {
return badRequest(onFail(boundForm));
} else {
return redirect(onSuccess(boundForm.get()));
}
}
}
然后是扩展 BaseController<T>
的控制器,其中 T 将成为您的模型 class(您要从表单绑定的模型)。例如:
public class ExampleController extends BaseController<FormModel> {
@Override
Html onFail(Form<FormModel> form) {
Logger.info(Json.stringify(form.errorsAsJson()));
return someTemplate.render(form);
}
@Override
Call onSuccess(FormModel elem) {
elem.save();
return redirect(routes.Application.index());
}
public Result aa(){
return submit(FormModel.class);
}
}
但是,在许多情况下,您可能会有一个控制器处理不同的模型类型。如果您使用这种方法,您将需要为每个模型创建控制器。也许您最终会拥有很多控制器。
我正在创建一个基于 Play Framework 2.3 的应用程序,我想将它拆分成多个模块。提交表单时,调用的操作几乎总是做同样的事情,就像:
public final Result submit() {
Result result = null;
Form<Something> boundForm = form.bindFromRequest();
if (boundForm.hasErrors()) {
potentiallyDoSomething();
result = badRequest(sometemplate.render(boundForm));
} else {
potentiallyDoSomethingWith(boundForm.get());
result = redirect(route.Application.somewhere());
}
return result;
}
所以,我想知道在抽象控制器中提取这种通用行为是否明智。我想出了一些我发现 questionable.
也许我完全不适应了。
感谢任何建议。
嗯,你当然可以这样做。你可以有这样的东西:
public abstract class BaseController<T> extends Controller {
abstract Html onFail(Form<T> form);
abstract Call onSuccess(T elem);
public Result submit(Class<T> clazz){
Form<T> boundForm = form(clazz).bindFromRequest();
if (boundForm.hasErrors()) {
return badRequest(onFail(boundForm));
} else {
return redirect(onSuccess(boundForm.get()));
}
}
}
然后是扩展 BaseController<T>
的控制器,其中 T 将成为您的模型 class(您要从表单绑定的模型)。例如:
public class ExampleController extends BaseController<FormModel> {
@Override
Html onFail(Form<FormModel> form) {
Logger.info(Json.stringify(form.errorsAsJson()));
return someTemplate.render(form);
}
@Override
Call onSuccess(FormModel elem) {
elem.save();
return redirect(routes.Application.index());
}
public Result aa(){
return submit(FormModel.class);
}
}
但是,在许多情况下,您可能会有一个控制器处理不同的模型类型。如果您使用这种方法,您将需要为每个模型创建控制器。也许您最终会拥有很多控制器。