2011-04-22 16 views
6

Cuando se define un elemento hook_menu puedo utilizar un método public static en una clase en lugar de utilizar el subrayado mundial nombrar Drupal convención tiende a ir para?¿Puedo usar un método estático como una devolución de llamada de menú en Drupal?

Por ejemplo, es el siguiente aceptable?

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

Me interesaría si lo has probado y no funcionó. La respuesta probablemente se reduce a si PHP admite llamar a una función de forma dinámica como esta. $ foo = 'MyClass :: prueba'; $ foo(); ... Mis pensamientos iniciales serían no, pero en realidad no lo he intentado. – Coder1

Respuesta

2

menu_execute_active_handler(), que es la función de Drupal que llama a la devolución de llamada del menú, contiene el siguiente código:

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

En PHP 5.2.3 o superior, es posible llamar call_user_func() como call_user_func('MyClass::myCallbackMethod').

El único problema que puedo ver es con los módulos de terceros que no esperan una devolución de llamada de menú es un método estático de clase, y usa function_exists($menu_callback).
Entonces, como informó Coder1, si los módulos del núcleo de Drupal, u otros módulos, tratan de llamar a la menu_callback utilizando el código similar al siguiente, entonces podrían causar un error de PHP.

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

Sí, debería funcionar, ya que esto hace:

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

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

Sin embargo, ¿por qué quieres hacer eso?

Como usted ha dicho, es común el uso de las funciones normales (que puede tener cargado ligeramente cuando sea necesario por el sistema de menús de forma automática) para devoluciones de llamada de página.

Si trabaja con Drupal, usted debe seguir el estándar de codificación oficial. Incluso si esto es solo para módulos personalizados. Si alguien necesita retomar su trabajo en algún momento, será más fácil para ellos si el código sigue el mismo estándar que se usa en cualquier otro lugar.

Ver también http://groups.drupal.org/node/20728#comment-71907

Cuestiones relacionadas