我正在做一个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方法论相去甚远,请原谅。