2012-09-18 30 views
6

Tôi đang cố gắng tìm ra cách để xây dựng một hệ thống móc rất giống với hệ thống mà Drupal sử dụng. Với Drupal, bạn có thể chỉ cần đặt tên một hàm theo một cách nào đó và nó sẽ tự động được gọi như một móc nếu module được kích hoạt.Tôi sẽ xây dựng một hệ thống móc nối php đơn giản hoạt động như thế nào?

Tôi đã xem xét các câu trả lời khác ở đây trên Stackoverflow, nhưng không ai trong số họ thực sự đưa ra câu trả lời về cách xây dựng loại tính năng này vào một ứng dụng PHP.

+0

Nhìn vào Drupal và đảo ngược kỹ sư không? –

+0

@Paul Tôi đã thực sự làm điều đó, nhưng Drupal có chức năng khá hơn một chút so với tôi thực sự cần, và nó không thực sự rõ ràng những gì đang thực sự xử lý hệ thống Hook. –

Trả lời

2

Tôi không quen thuộc với internals Drupal, nhưng nó có thể thực hiện nó bằng cách sử Reflection:

http://php.net/manual/en/book.reflection.php

Bạn sẽ bao gồm các trang PHP có chứa các chức năng móc, sau đó sử dụng phản ánh để tìm chức năng hoặc lớp các phương thức khớp với một quy ước đặt tên nhất định, sau đó lưu các con trỏ hàm để gọi các hàm đó khi thích hợp (chẳng hạn như các sự kiện trong vòng đời của một mô-đun).

+0

Tại sao tôi bị bỏ phiếu? – Dai

+0

Tôi đang đọc trang bạn cung cấp, không chắc chắn lý do tại sao một người nào đó sẽ bỏ phiếu cho bạn mà không để lại nhận xét giải thích. Cảm ơn. –

3

Bạn có thể sử dụng get_defined_functions của PHP để lấy một chuỗi các tên hàm, sau đó lọc các tên đó theo một số định dạng được xác định trước.

này mẫu từ các tài liệu PHP:

<?php 
function myrow($id, $data) 
{ 
    return "<tr><th>$id</th><td>$data</td></tr>\n"; 
} 

$arr = get_defined_functions(); 

print_r($arr); 
?> 

Đầu ra một cái gì đó như thế này:

Array 
(
    [internal] => Array 
     (
      [0] => zend_version 
      [1] => func_num_args 
      [2] => func_get_arg 
      [3] => func_get_args 
      [4] => strlen 
      [5] => strcmp 
      [6] => strncmp 
      ... 
      [750] => bcscale 
      [751] => bccomp 
     ) 

    [user] => Array 
     (
      [0] => myrow 
     ) 

) 

Đó là kinda một kỹ thuật sơ sài khi so sánh với một hệ thống móc rõ ràng hơn, nhưng nó hoạt động.

+0

+1. Và với một lưu ý phụ: cũng có https://github.com/AOP-PHP/AOP mà bạn có thể sử dụng bổ sung cho điều này. Trên thực tế, tôi nghĩ rằng trong một thiết kế sạch sẽ, bạn sẽ chỉ sử dụng lập trình hướng-khía cạnh, mà không có hack với "chức năng được xác định", nhưng tôi không nghĩ rằng OP là tiên tiến. Tuy nhiên, nó là một tốt đẹp-to-know cho độc giả khác. Bạn cần ít nhất một VPS để sử dụng, vì phần mở rộng AOP không phải là một phần của bản phân phối chuẩn. – Flavius

8

Đây là cách thức làm việc đó và cách bạn có thể thực hiện. Sử dụng chuỗi nối với quy ước tên. Với hàm_exists() và call_user_func_array(), bạn nên thiết lập tất cả.

Dưới đây là hai chức năng drupal nội bộ mà làm các trick (module.inc)

function module_invoke() { 
    $args = func_get_args(); 
    $module = $args[0]; 
    $hook = $args[1]; 
    unset($args[0], $args[1]); 
    $function = $module .'_'. $hook; 
    if (module_hook($module, $hook)) { 
    return call_user_func_array($function, $args); 
    } 
} 

function module_hook($module, $hook) { 
    return function_exists($module .'_'. $hook); 
} 

Do đó, bạn chỉ cần gọi

module_invoke('ModuleName','HookName', $arg1, $arg2, $arg3); 

mà cuối cùng sẽ gọi

ModuleName_HookName($arg1,$arg2,$arg3); 
+0

Tôi không biết tại sao bạn bị điều chỉnh, tôi cũng vậy - vì vậy tôi đã cho bạn một cuộc bỏ phiếu. – Dai

0

Tại sao không chỉ sử dụng chức năng tồn tại? Nhà phát triển có thể đặt tên hàm theo một cách nhất định và mã móc chỉ kiểm tra xem nó có tồn tại sau đó gọi cho chúng

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