扩展控制器以实现通用功能

时间:2014-11-02 01:20:01

标签: php cakephp

我正在开发一个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 {
            ...
        }
    }

    ...
}

但此时我迷路了。我想拥有一个Base数据库表和模型......我只想要一些东西,这样就不必多次写出几乎相同的get()方法了。 ..并且让我说我制作一个控制器" FooController"这扩展了这个控制器......我该怎么做才能让get()现在与Foo模型/表交互?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设您想要用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);
    }
}

不熟悉蛋糕以提供更好的解决方案,在调用查找之前对模型存在进行一些检查可能不会受到伤害。

如果按照CakePHP方法解决这个问题,请原谅。