2012-08-04 22 views
2

我有一个加载函数,每当用户访问页面时都会调用过多的加载函数。当然,我只需要它每页请求运行一次,而不是多次调用它。之前,_load()只用了两次MENU_CALLBACK,然后我用默认的MENU_NORMAL_ITEM测试了它,它增加到了四。尽管我已将其更改回来并清除了缓存,但它现在仍运行四次,我只希望它运行一次。多次调用通配符加载函数(_load)

我的问题是,为什么我的加载函数被多次调用?任何有识之士将不胜感激。

$items['daycare/%isValid/home'] = array(
    'title' => 'Daycare Admin Home', 
    'page callback' => 'daycares_home_page', 
    'load arguments' => array(0),//Passes 1st part of url 'daycare' as 2nd arg 
    'page arguments' => array(0), 
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK, 
); 

function isValid_load($pageID, $pageType){ 
    /*Do stuff to validate wildcard part of URL. Will throw 404/403 if invalid*/ 
    return $pageId; 
} 

回答

3

您可以使用develddebug_backtrace()功能怎么看/什么是呼唤你的负载功能。

function isValid_load($pageID, $pageType){ 
    ddebug_backtrace(); 
    ... 
} 

当你这样做时,请注意两个电话可以index.php追溯到最后两行。第一次引导Drupal并初始化主题,而第二次调用实际完成渲染页面的工作。尽管这两个操作似乎都会调用相同的_menu_translate(),这会导致您的函数调用。作为一个方面说明,如果你关注性能,你可能会对这个Lullabot article about caching感兴趣。

我意识到这是一个部分答案,因为我仍然熟悉Drupal自己最深入的工作方式。我欢迎相互竞争的答案,这些答案可以提供一个更清晰,更完整的解释,说明为什么Drupal框架的构造方式是多次调用_load函数。

+0

您的回答仍然非常有帮助!谢谢Nmc。我要尝试使用回溯。就这一点而言,我并不太在乎表现。我将在_load()中处理的操作是相当简单的查询。尽管如此,我已经将该文章加入书签以供将来使用。 :) – SFox 2012-08-05 17:59:08

+1

另一种选择是配置xdebug并通过调试器推送代码,虽然有时配置可能有点棘手。然后,您可以在通配符加载器上添加一个断点,检查值,查看调用堆栈等。 – iainp999 2012-08-06 10:45:07