CakePHP:避免控制器操作中的代码重复

时间:2014-01-09 21:55:24

标签: cakephp code-duplication

我刚开始使用cakePHP创建一个简单的Web应用程序,并且想知道我是否可以避免代码重复。我有两个模型,相应的控制器都包含相同的操作(索引,视图,添加,编辑,删除),代码略有不同,例如:

交易控制器

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

那么有没有办法避免这种代码重复?

2 个答案:

答案 0 :(得分:2)

Components用于此特定目的。

根据CakePHP的书:

  

组件是控制器之间共享的逻辑包。   如果你发现自己想要复制和粘贴东西   控制器,你可能会考虑包装一些功能   成分

更多详情:"Creating a Component"

其他

您还可以查看CRUD Plugin by Friends Of Cake

答案 1 :(得分: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();
    }
}

我通常不会做这种事情。您可能最终会降低可读性,因为您无法获得更多回报,或者您可能会发现随着您进一步深入开发,您的控制器将开始出现分歧。