Контроллер

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

Вот действия add и edit, созданные через консоль:

function add() {
    if (!empty($this->data)) {
        $this->Post->create();
        if ($this->Post->save($this->data)) {
            $this->flash(__(‘User saved.’, true),
                         array(‘action’=>‘index’));
        } else {
        }
    }
}

function edit($id = null) {
    if (!$id && empty($this->data)) {
        $this->flash(__(‘Invalid Post’, true), array(‘action’=>‘index’));
    }
    if (!empty($this->data)) {
        if ($this->Post->save($this->data)) {
            $this->flash(__(‘The Post has been saved.’, true),
                         array(‘action’=>‘index’));
        } else {
        }
    }
    if (empty($this->data)) {
        $this->data = $this->Post->read(null, $id);
    }
}

Как вы видите, весь метод add продублирован в методе edit. Мы можем избавиться от метода add и заставить метод edit обрабатывать создание новых записей. Есть несколько способов сделать это.

Можно удалить метод add() полностью, добавив маршрут, который перенаправляет /add на метод edit

Router::connect(‘/:controller/add’, array(‘action’ => ‘edit’));

Или же можно все ссылки, указывающие на /add, заменить на /edit

Также потребуются некоторые изменения в методе edit. Удалите первый блок if:

if (!$id && empty($this->data)) {
  $this->flash(__(‘Invalid Post’, true), array(‘action’=>‘index’));
}

Измените последний блок if c:

if (empty($this->data)) {

на:

if ($id && empty($this->data)) {

Метод edit теперь должен выглядеть так:

function edit($id = null) {
    if (!empty($this->data)) {
        if ($this->Post->save($this->data)) {
            $this->flash(__(‘The Post has been saved.’, true),
                         array(‘action’=>‘index’));
        } else {
        }
    }
    if ($id && empty($this->data)) {
        $this->data = $this->Post->read(null, $id);
    }
}

Отображение

Можно удалить файл add.ctp, потому что он больше никем не вызывается. Add.ctp и edit.ctp по умолчанию очень похожи, так что таким образом удастся избежать избыточности кода. Отображение edit будет работать для создания новых записей без каких-либо изменений. Если есть необходимость, то можно изменять подписи в зависимости от текущего действия.

echo sprintf(__(‘%s %s’, true),
             __(ucwords($this->action), true),
             __(‘Post’, true));

Выведет «Добавить запись» или «Изменить запись» в зависимости от ситуации (и при наличии локализации, конечно же).

Это — перевод отрывка из книги Super Awesome Advanced CakePHP Tips