多次调用通配符加载器函数(_load)


Wildcard Loader function called multiple times (_load)

我有一个加载器函数,每当用户访问页面时,就会过度调用它。当然,我只需要它在每个页面请求中运行一次,相反,它会被调用多次。早些时候,_load()只用MENU_CALLBACK运行了两次,然后我用默认的MENU_NORMAL_ITEM测试了它,它增加到了四次。尽管我已经把它改回来,并清除了缓存,但它现在仍然运行了四次,我只希望它运行一次。

我的问题是,为什么我的加载程序函数被多次调用?如有任何见解,我们将不胜感激。

$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;
}

您可以使用devel的ddebug_backtrace()函数来查看如何调用您的加载函数。

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

当您这样做时,请注意,这两个调用可以追溯到index.php中的最后两行。第一个调用引导Drupal并初始化主题,而第二个调用实际上完成了渲染页面的工作。尽管这两个操作似乎都调用了相同的_menu_translate(),这导致了对函数的调用。

顺便说一句,如果您关心性能,您可能会对这篇关于缓存的Lullabot文章感兴趣。

我意识到这只是部分答案,因为我自己仍在熟悉Drupal最深层的工作原理。我欢迎相互竞争的答案,这些答案可以更清晰、更完整地解释为什么Drupal框架的结构会多次调用_load函数。