【问题标题】:Wildcard Loader function called multiple times (_load)多次调用通配符加载器函数 (_load)
【发布时间】:2012-08-04 16:16:06
【问题描述】:

我有一个加载器函数,每当用户访问该页面时,它就会被过度调用。自然,我只需要它在每个页面请求运行一次,而是多次调用它。早些时候,_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;
}

【问题讨论】:

    标签: php callback drupal-7 drupal-modules drupal-hooks


    【解决方案1】:

    您可以使用develddebug_backtrace() 函数来查看调用加载函数的方式/内容。

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

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

    附带说明,如果您关心性能,您可能会对Lullabot article about caching 感兴趣。

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

    【讨论】:

    • 你的回答还是很有帮助的!感谢 NMC。我将尝试使用回溯。我不太关心性能,仅此而已。我将在 _load() 中处理的操作是相当简单的查询。尽管如此,我还是为这篇文章添加了书签以备将来使用。 :)
    • 另一种选择是配置 xdebug 并通过调试器推送代码,尽管有时配置起来有点棘手。然后,您就可以在通配符加载器上设置断点、检查值、查看调用堆栈等。
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多