0

Я создаю приложение, основанное на Play Framework 2.3, и хочу разбить его на модули. Когда форма отправлена, то действие называется делает почти всегда то же самое, которое, как:Play 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.

Возможно, я полностью из него.

Любые предложения оценены.

ответ

1

Ну, конечно, вы могли бы это сделать. Вы могли бы иметь что-то вроде этого:

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 будет ваша модель класса (тот, который вы хотите связать с вашей формы). например:

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

    } 

} 

Однако во многих случаях у вас может быть один контроллер, который обрабатывает разные типы моделей. Если вы используете этот подход, вам нужно будет создать контроллер для каждой модели. Возможно, у вас много контроллеров.

+0

Типичное использование этого поведения было бы в контроллере CRUD, поэтому я не буду возражать против наличия одного контроллера на модель в этом случае. Мне просто интересно, стоит ли это. – Thomas

+0

Еще одна вещь, я предполагаю, что вы используете динамический вызов в определениях маршрутов для метода 'aa()'. Что-то вроде: 'POST/aa @ controller.ExampleController.aa()'? – Thomas

+1

Несомненно. Этот код следует добавить в «маршруты». Это может быть полезно для контроллера CRUD и для приложения с множеством операций. –