CakePHP: избегайте дублирования кода в действиях контроллера

Я только начал создавать простое веб-приложение с cakePHP и задавался вопросом, смогу ли я избежать дублирования кода в своих действиях. У меня есть две модели, и соответствующие контроллеры содержат одни и те же действия (индекс, просмотр, добавление, редактирование, удаление) с незначительно разным кодом, например:

Контроллер транзакций

public function add() {
    if ($this->request->is('post')) {
        $this->Transaction->create();
        if ($this->Transaction->save($this->request->data)) {
            $this->Session->setFlash(__('The transaction has been saved.'));
            return $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The transaction could not be saved. Please, try again.'));
        }
    }
}

Второй контроллер будет иметь такое же действие add(), только для другой модели (т. е. заменить transaction, например, на trades).

Так есть ли способ избежать такого дублирования кода?


person dev0    schedule 09.01.2014    source источник


Ответы (2)


Компоненты предназначены именно для этой цели.

Согласно книге CakePHP:

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

Дополнительные сведения: "Создание компонента"

Другое:

Вы также можете ознакомиться с плагином CRUD от Friends Of Cake.

person Dave    schedule 09.01.2014

Вероятно, есть несколько способов избежать дублирования. На данный момент я могу думать о том, чтобы написать контроллер, от которого наследуются ваши контроллеры, что-то вроде:

class BaseController extends AppController {
    protected $modelName = '';

    /*Make sure all methods in this model are protected, so users
    can't navigate to them */
    protected function add() {
         if($this->request->is('post')) {
             $this->{$this->$modelName}->create();

        //etc....
    }
}

class TransactionController extends BaseController {
    public function __construct ( $request = null , $response = null ) {
          $this->modelName = 'Transaction';
          parent::__construct($request, $response);
    }

    public function add() {
          parent::add();
    }
}

Хотя обычно я не занимаюсь такими вещами. Вы можете в конечном итоге уменьшить читаемость из-за незначительной отдачи, или вы можете обнаружить, что ваши контроллеры начнут расходиться по мере того, как вы будете углубляться в разработку.

person Kai    schedule 09.01.2014