CakePHP共享控制器视图/功能

时间:2014-01-21 19:32:01

标签: php cakephp dry

我不知道该怎么做:

我有一个CakePHP项目,它使用AdministratorsControllerUsersController来表示不同的角色等等。但是,用户也可以保存一条消息和一个管理员!那么,我应该重复相同的功能还是什么?

function saveMessage(){
    $this->autoRender = false;
    if (!$this->RequestHandler->isPost())
        $this->Session->setFlash('Error 78.', 'flash_custom_danger');
    else{   
        if(!$this->Message->save($this->request->data))
            $this->Session->setFlash('Error 985.', 'flash_custom_success');
        else
            $this->Session->setFlash('Success!', 'flash_custom_success');       

    }
    $this->redirect('/');
}

2 个答案:

答案 0 :(得分:1)

将函数移动到app_controller,因为两个控制器都将从它扩展。

在app_controller中:

function my_function($controller_specific_string = null){ 
    //stuff here common to both controllers
}

在控制器中:

function my_function() { //extended function in both controllers
  // do controller specific stuff here...

  return parent::my_function('from_users_controller');
}

答案 1 :(得分:1)

好的,只是针对这种情况(通常我建议将功能放在模型或AppController中)我只是创建一个父类。

我们称之为GeneralUsers(想象力迟到)

class GeneralUsersController extends AppController {
    protected function _saveMessage(){
        $this->autoRender = false;
        if (!$this->RequestHandler->isPost())
            $this->Session->setFlash('Error 78.', 'flash_custom_danger');
        else{   
            if(!$this->Message->save($this->request->data))
                $this->Session->setFlash('Error 985.', 'flash_custom_success');
            else
                $this->Session->setFlash('Success!', 'flash_custom_success');       
        }
        $this->redirect('/');
    }
}

让我们UsersControllerAdministratorsController延伸到那个

class UsersController extends GeneralUsersController {
    public function myAction() {
        $this->_saveMessage();
    }
}
// and the Administrator controller one

这样,具有这些功能的唯一控制器就是用户和管理员。

现在,如果在保存之前进行了大量验证,并且您希望避免重复这些验证,我会说将其放在模型中。如果每个控制器都应该有权访问该函数,那么将它放在AppController中。但由于“管理员”是具有更多权限的“用户”(并且您没有使用“admin_”前缀分隔该功能),因此请使用额外的父类。但请注意这些功能,除非您希望这些功能可以通过网址访问,否则不要让它们为public

相关问题