Строим блог на Areto фреймворк

CRUD контроллер

В модуле администрирования многие действия с объектами разных классов (просмотр, редактирование, удаление) повторяются и могут быть обобщены в едином базовом контроллере.

module/admin/component/CrudController.js

const Base = require('./Controller');
module.exports = class CrudController extends Base {
  // place methods here
};

Метод actionCreate отвечает за действие по созданию нового объекта класса, полученного из getModelClass. При создании используется сценарий create, по которому могут быть отфильтрованы правила валидации модели.

На GET-запрос рендерится пустая форма модели. На POST-запрос происходит загрузка значений атрибутов, проверка и, в случае успеха, сохранение нового объекта. Если валидация провалилась, то форма снова заполняется переданными значениями с отмеченными ошибками. После сохранения происходит редирект на страницу, с которой привела ссылка на создание модели.

module/admin/component/CrudController.js

async actionCreate () {
  let model = new (this.getModelClass());
  model.scenario = 'create';
  this.isPost() && await model.load(this.getBodyParams()).save()
    ? this.backToRef()
    : await this.render('create', {model});
}

Действие actionView отображает объект. В целевом контроллере метод может быть переопределен для загрузки вместе с моделью связанных значений relations.

module/admin/component/CrudController.js

async actionView (params) {
  let model = await this.getModel(params);
  await this.render('view', {model});
}

Метод actionUpdate отличается от метода actionCreate только лишь сценарием валидации и начальным поиском модели для редактирования.

module/admin/component/CrudController.js

async actionUpdate (params) {
  let model = await this.getModel(params);
  model.scenario = 'update';
  this.isPost() && await model.load(this.getBodyParams()).save()
    ? this.backToRef()
    : await this.render('update', {model});
}

Метод actionDelete удаляет модель, идентификатор которой передан в GET-параметре. Если пришел ajax-запрос, то после удаления возвращается идентификатор удаленного объекта, иначе происходит переадресация на предыдущую страницу.

module/admin/component/CrudController.js

async actionDelete (params) {
  let model = await this.getModel(params);
  await model.remove();
  this.isAjax()
    ? this.send(model.getId())
    : this.backToRef();
}