【发布时间】:2013-02-10 21:54:56
【问题描述】:
我有一个从我的 layouts/default.ctp 文件中调用的侧边栏导航元素,我需要从我的 Photos 控制器访问一些关于类别的数据。我该怎么做呢?
【问题讨论】:
标签: php cakephp access-control
我有一个从我的 layouts/default.ctp 文件中调用的侧边栏导航元素,我需要从我的 Photos 控制器访问一些关于类别的数据。我该怎么做呢?
【问题讨论】:
标签: php cakephp access-control
请谨慎使用 requestAction,除非您有效地使用缓存,否则它会真正减慢您的应用程序,因为每次调用它时它都会开始一个全新的请求周期。
Travis Leleu 的回答将是标准的做事方式。但是,如果您必须将数据(出于可移植性或其他原因)导入到元素中,那么 requestAction 不是可行的方法。
由于您没有执行任何必须在控制器中的业务逻辑,我强烈建议您将模型类作为单例导入并实例化到您的元素中。你可以使用 ClassRegistry::init();
$Photo = ClassRegistry::init('Photo');
$Photo->find('all');
如果您需要对数据进行任何额外的处理,您应该在模型本身中使用 Cakes afterFind 回调或在您的 Photo 模型中创建自定义方法:
class Photo extends AppModel {
function customFind () {
$photos = $this->find('all');
foreach ($photos as $photo) {
//processing code here...
}
}
}
然后在你的元素中调用它:
$Photo = ClassRegistry::init('Photo');
$Photo->customFind();
基本上,我在这里想要表达的是,唯一适合 requestAction 的情况是您需要执行重定向或使用组件等操作。
如果您只是简单地检索和/或操作数据,那么它属于模型。
【讨论】:
你可以把你的layous/default.ctp当作一个普通的模板,然后放
<?php echo $this->element('your element'); ?>
你需要它的地方。
b.t.w,使用:
$data = $this->requestAction('controller/action');
访问数据
【讨论】:
您可以将数据发送到您的元素。例如在你的 default.ctp 中:
<?php echo $this->element('side_nav', $your_data); ?>
您可以在 side_nav.ctp 中处理该数据。
【讨论】:
你为什么不按照标准的 Cake 约定来做呢?
在控制器中,
$this->set('categories', $this->Photos->find(...));
【讨论】: