为通用功能扩展控制器


Extending Controller for common functionalities

我正在做一个CakePHP项目,我意识到我的许多控制器都有几乎相同的代码。我决定我应该尝试制作一种"BaseController",并让其他控制器扩展它。。。像这样的东西:

class BaseController extends AppController {
    public $components = array(
        'RequestHandler'
    );
    public function get($param = "all", $value = "") {
        $this->layout = 'ajax';
        if($param == "all") {
            $data = $this->Base->find('all');
        }  elseif ($param == "id") {
            $data = $this->Base->findById($value);
        } else {
            ...
        }
    }
    ...
}

但在这一点上,我迷路了。我不想有一个基本数据库表和模型。。。我只是想要一些东西,这样就不必写十几次几乎相同的get()方法。。。比方说我做了一个控制器"FooController"来扩展这个控制器。。。我如何使get()现在与Foo模型/表交互?

我认为有一种Cake方法可以做到这一点,而不是有大量重复的代码。。。但是我一直找不到它。

$data = $this->{$this->modelClass}->find('all');应该做到这一点http://api.cakephp.org/2.4/source-class-Controller.html#268-276.

假设您想用Foo模型替换Base,我个人会将模型名称作为参数传递:

public function get($param = 'all', $value = '', $model = 'Foo')
{
    $this->layout = 'ajax';
    if($param == 'all') {
        $data = $this->{$model}->find('all');
    } elseif ($param == 'id') {
        $data = $this->{$model}->findById($value);
    }
}

对cake不够熟悉,无法提供更好的解决方案,在调用find之前对模型的存在性进行一些检查可能不会有什么坏处。

如果这与CakePHP方法论相去甚远,请原谅。