我可以在 drupal 中使用静态方法作为菜单回调吗?

发布于 2024-11-03 01:20:18 字数 279 浏览 2 评论 0原文

在定义 hook_menu 项时,我可以在类上使用公共静态方法,而不是使用 drupal 倾向于使用的全局下划线命名约定吗?

例如,以下内容可以接受吗?

$items['test'] = array(
  'page callback' => 'MyClass::test',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK
);

When defining a hook_menu item can I use a public static method on a class rather than using the global underscore naming convention drupal tends to go for?

For example, is the following acceptable?

$items['test'] = array(
  'page callback' => 'MyClass::test',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK
);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

摘星┃星的人 2024-11-10 01:20:18

menu_execute_active_handler(),这是Drupal调用菜单回调的函数包含以下代码:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    if ($router_item['file']) {
      require_once($router_item['file']);
    }
    return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
  }
  else {
    return MENU_ACCESS_DENIED;
  }
}

在 PHP 5.2.3 或更高版本中,可以将 call_user_func() 调用为 call_user_func('MyClass::myCallbackMethod').

我能看到的唯一问题是不期望菜单回调的第三方模块是类静态方法,并使用 function_exists($menu_callback)
然后,正如 Coder1 报告的那样,如果 Drupal 核心模块或其他模块尝试使用类似于以下的代码调用 menu_callback,那么它们可能会导致 PHP 错误。

$menu_callback = $router_item['page_callback'];
$menu_callback($router_item['page_arguments']);

menu_execute_active_handler(), which is the Drupal function that calls the menu callback, contains the following code:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    if ($router_item['file']) {
      require_once($router_item['file']);
    }
    return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
  }
  else {
    return MENU_ACCESS_DENIED;
  }
}

In PHP 5.2.3, or higher, is possible to call call_user_func() as call_user_func('MyClass::myCallbackMethod').

The only problem I can see is with third-party modules that don't expect a menu callback is a class static method, and use function_exists($menu_callback).
Then, as Coder1 reported, if Drupal core modules, or other modules, try to call the menu_callback using code similar to the following, then they could cause a PHP error.

$menu_callback = $router_item['page_callback'];
$menu_callback($router_item['page_arguments']);
泪冰清 2024-11-10 01:20:18

是的,它应该有效,就像这样:

class Test {
  static function method() { echo 'Yes'; }
}

$name = 'Test::method';
call_user_func_array($name, array());

但是,你为什么要这样做呢?

正如您所说,通常使用普通函数(必要时可以由菜单系统自动延迟加载)进行页面回调。

如果您使用 Drupal,则应该遵循官方编码标准。即使这仅适用于自定义模块。如果有人需要在某个时候接手您的工作,如果代码遵循与其他地方使用的相同标准,对他们来说会更容易。

另请参阅http://groups.drupal.org/node/20728#comment-71907

Yes, it should work, as this does:

class Test {
  static function method() { echo 'Yes'; }
}

$name = 'Test::method';
call_user_func_array($name, array());

However, why would you want to do that?

As you said, It is common to use normal functions (which you can have lazy loaded when necessary by the menu system automatically) for page callbacks.

If you work with Drupal, you should follow the official coding standard. Even if this is for custom modules only. If someone needs to pick up your work at some point, it will be easier for them if the code follows the same standard that is used everywhere else.

See also http://groups.drupal.org/node/20728#comment-71907

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文