确保整个应用程序中存在变量

时间:2013-04-29 21:09:41

标签: cakephp

在我的控制器中,我想设置一些值,并在我的应用程序的不同视图中存在(或实时)。

我在某处找到了我需要使用beforeFilter函数的地方,但我不确定这是否正确以及我是如何做到的。

所以在我的控制器中我想要

public function page1() {
  $this->Model->setId('123');
}

public function page2() {
  $this->Model->getId(); // would able to get the Id that was set from page1 function
  $this->Model->setName('Bob');
}

public function page3() {
  $this->Model->getId(); 
  $this->Model->getName();
}

如果您有疑问,请告诉我。

2 个答案:

答案 0 :(得分:1)

要在整个视图中使用这种“持久性”,我想最简单的方法是会话。

请注意,使用您提供的代码(我知道这不是一个工作示例),您希望变量在模型中是持久的,但是在同一个控制器(或其他控制器)的操作之间不会保持相同的模型物质)。

您必须在会话中设置该变量并在您想要使用它时检索它,或者在数据库中创建方法并在模型中创建方法以获取最后插入的ID,例如。

所以你的代码就像

public function page1() {
   $this->Session->write('id', '123');
}

public function page2() {
   $this->Session->read('id');
   $this->Session->write('name', 'Bob');
}

public function page3() {
   $this->Session->read('id');
   $this->Session->read('name');
}

答案 1 :(得分:0)

使用单个模型方法返回数组中的所有数据,如

return array('varName' => $value, 'varName2' => $value2);

然后,您可以在过滤之前从控制器调用此模型方法,只需执行

$this->set(ClassRegistry::init('MyModel')->commonViewVars());

如果你想描述你认为你需要做什么,我可以给你一个更好的建议,比如使用requestAction(),这可能是另一种选择,这取决于你想要做什么。

根据您要传递给每个页面的数据,您应该考虑将其缓存。如果它的菜单例如“永远”缓存它,只需在菜单更改时更新缓存。