如何在cakephp中调用控制器时立即调用函数

时间:2012-11-28 11:25:48

标签: php cakephp cakephp-2.0

我正在cakephp中创建一个简单的网站。

我在“元素”中保留了页眉和页脚,但我的问题是标题菜单来自数据库,在我调用函数之前它不可用。

我希望一旦控制器被调用,菜单的功能就应该被自己调用。

2 个答案:

答案 0 :(得分:3)

在AppController中添加:

function beforeFilter(){
    $this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}

然后,在视图中,可以通过调用echo $menu['yourModel']['menu'];

来访问该菜单

答案 1 :(得分:1)

<强> TLDR:

不是每次加载整个控制器(或所有控制器)时调用该函数,最好在加载element时调用该函数。这使您可以更加灵活地前进。例如,登录屏幕可能不需要菜单 - 或者你最终可能会添加一个具有不同菜单的管理工具......等等。

CakePHP使用requestAction()使这非常容易 - 请在此处阅读更多内容:http://book.cakephp.org/2.0/en/views.html#passing-variables-into-an-element

旁注:将所有查询保留在模型中,而不是直接从控制器中调用它们也是理想的(MVC模式和许多其他原因)。

示例代码:

/**
 * MenusController (or any other controller you want)
 */
public function get_menu_main() {
    $this->set('menu', $this->Menu->getMenuMain());
}
public function get_menu_footer() {
    $this->set('menu', $this->Menu->getMenuFooter());
}

/**
 * Menu model
 */
public function getMenuMain() {
    return $this->findById('12345');
}
public function getMenuFooter() {
    return $this->findById('67891');
}

然后,在您的元素中,只需使用requestAction来检索该特定元素所需的数据:

/**
* MainMenu element
*/
$menu = $this->requestAction('menus/get_menu_main/');

/**
* FooterMenu element
*/
$menu = $this->requestAction('menus/get_menu_footer/');

旁注:要更合适一点,您可以使用$this->Html->url()代替对操作的网址进行硬编码。

旁注:有些代码可能看起来像是在你不需要它时添加额外的代码,但是通过将它们分解到正确的MVC位置,你的代码会更加清晰更灵活/可升级......等等。养成这样做的习惯会让事情变得更容易,当事情开始变得更加复杂。 (实际上,上面的代码添加了几行,但就复杂性而言,我认为比在AppController中加载一个元素的变量更容易理解./ endrant