2014-01-09 5 views
1

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

контроллер Transaction

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

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

ответ

1

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

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

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

Подробнее: "Creating a Component"

Другое:

Вы также можете посмотреть на CRUD Plugin by Friends Of Cake.

+0

Очень верно ... оставьте это ему ... – Anubhav

0

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

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

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

Смежные вопросы