2011-04-22 11 views
6

Podczas definiowania elementu hook_menu można użyć publicznej metody statycznej zamiast używać globalnej konwencji nazw podkreślenia, której drupal zwykle używa?Czy mogę użyć metody statycznej jako wywołania zwrotnego menu w drupalu?

Na przykład, czy następujące wartości są dopuszczalne?

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

Byłbym zainteresowany, gdybyś go wypróbował i nie zadziałał. Odpowiedź prawdopodobnie sprowadza się do tego, że jeśli PHP obsługuje dynamiczne wywoływanie funkcji w ten sposób. $ foo = 'MyClass :: test'; $ foo(); ... Moje początkowe myśli byłyby nie, ale tak naprawdę nie próbowałem. – Coder1

Odpowiedz

2

menu_execute_active_handler(), która jest funkcją Drupal, który wywołuje zwrotnego menu, zawiera następujący kod:

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

W PHP 5.2.3 lub nowszy, jest możliwe, aby zadzwonić call_user_func() jako call_user_func('MyClass::myCallbackMethod').

Jedyny problem, jaki widzę, dotyczy modułów innych firm, które nie oczekują wywołania zwrotnego z menu, które jest metodą statyczną klasy i używają function_exists($menu_callback).
Następnie, jak zgłosił program Coder1, jeśli moduły podstawowe Drupala lub inne moduły spróbują wywołać menu_callback za pomocą kodu podobnego do poniższego, mogą spowodować błąd PHP.

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

Tak, to powinno działać, jak to robi:

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

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

jednak, dlaczego chcesz to zrobić?

Jak już powiedziałeś, często używane są normalne funkcje (które możesz automatycznie załadować w razie konieczności przez system menu) w celu wywołania oddzwonienia.

Jeśli pracujesz z Drupalem, powinieneś postępować zgodnie z oficjalnym standardem kodowania. Nawet jeśli dotyczy to tylko modułów niestandardowych. Jeśli ktoś musi odebrać swoją pracę w pewnym momencie, będzie dla nich łatwiejsze, jeśli kod będzie zgodny z tym samym standardem, który jest używany wszędzie indziej.

Zobacz także http://groups.drupal.org/node/20728#comment-71907

Powiązane problemy