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);

    }

}

但是,在许多情况下,您可能会有一个控制器处理不同的模型类型。如果您使用这种方法,您将需要为每个模型创建控制器。也许您最终会拥有很多控制器。