Могу ли я использовать статический метод в качестве обратного вызова меню в drupal? - PullRequest
6 голосов
/ 22 апреля 2011

При определении элемента hook_menu я могу использовать открытый статический метод для класса, а не использовать глобальное соглашение об именах подчеркивания, которое обычно использует drupal?

Например, допустимо ли следующее?

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

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

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']);
1 голос
/ 22 апреля 2011

Да, это должно работать, как это:

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

...