2011-04-22 40 views
6

Khi xác định mục hook_menu, tôi có thể sử dụng phương pháp tĩnh công khai trên một lớp thay vì sử dụng drupal quy ước đặt tên gạch dưới toàn cầu có xu hướng đi không?Tôi có thể sử dụng phương thức tĩnh làm gọi lại menu trong drupal không?

Ví dụ: thông tin sau có thể chấp nhận được không?

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

Tôi muốn được quan tâm nếu bạn đã thử nó và nó không hoạt động. Câu trả lời có thể là do PHP hỗ trợ gọi một hàm động như thế này. $ foo = 'MyClass :: test'; $ foo(); ... Suy nghĩ ban đầu của tôi sẽ là không, nhưng tôi đã không thực sự thử nó. – Coder1

Trả lời

2

menu_execute_active_handler(), đó là chức năng Drupal mà các cuộc gọi callback menu, chứa đoạn mã sau:

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

Trong PHP 5.2.3 hoặc cao hơn, có thể gọi call_user_func()call_user_func('MyClass::myCallbackMethod').

Vấn đề duy nhất tôi có thể thấy là với các mô-đun bên thứ ba không mong đợi một cuộc gọi lại menu là phương thức tĩnh lớp và sử dụng function_exists($menu_callback). Sau đó, như Coder1 đã báo cáo, nếu các mô-đun lõi Drupal hoặc các mô-đun khác, hãy thử gọi menu_callback bằng cách sử dụng mã tương tự như sau, sau đó chúng có thể gây ra lỗi PHP. Quay lại đầu trang |||||||||||||||||||||||||||||||||||||||||||

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

Vâng, nó nên làm việc, vì điều này không:

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

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

Tuy nhiên, tại sao bạn muốn làm điều đó?

Như bạn đã nói, Việc sử dụng các chức năng bình thường (mà bạn có thể tải xuống một cách tự động khi cần thiết bởi hệ thống menu) là một cách tự động.

Nếu bạn làm việc với Drupal, bạn nên tuân thủ tiêu chuẩn mã hóa chính thức. Ngay cả khi điều này chỉ dành cho các mô-đun tùy chỉnh. Nếu ai đó cần phải nhận công việc của bạn tại một số điểm, nó sẽ dễ dàng hơn cho họ nếu mã theo cùng một tiêu chuẩn được sử dụng ở mọi nơi khác.

Xem thêm http://groups.drupal.org/node/20728#comment-71907

Các vấn đề liên quan