2012-09-18 18 views
6

Drupal'ın kullandığı yönteme çok benzer bir kanca sistemi oluşturmanın bir yolunu bulmaya çalışıyorum. Drupal ile sadece bir işlevi belirli bir şekilde adlandırabilirsiniz ve modül etkinleştirildiğinde otomatik olarak bir kanca olarak çağrılır.Böyle çalışan basit bir php kanca sistemi nasıl kurarım?

Stackoverflow'taki diğer yanıtlara baktım, ancak bunların hiçbiri bir PHP uygulamasında bu tür bir özelliği nasıl oluşturacağınıza dair bir cevap vermiyor.

+0

Drupal'a bakın ve tersine mühendislik yapınız mı? –

+0

@Paul Bunu gerçekten yaptım, ancak Drupal aslında ihtiyacım olandan biraz daha fazla işlevselliğe sahip ve aslında Kanca sistemini idare eden şeyin ne olduğu net değil. –

cevap

2

Ben Drupal iç yapıları aşina değilim, ama muhtemelen o Reflection kullanarak yapar: o zaman fonksiyonları ya da sınıf bulmak için yansıma kullanın

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

Sen kanca işlevlerini içeren PHP sayfasını yer alacağını Belirli bir adlandırma kuralıyla eşleşen yöntemler, daha sonra uygun olduğunda (bir modülün yaşam döngüsündeki olaylar gibi) bu işlevleri çağırmak için işlev göstergelerini kaydedin.

+0

Neden oy kullandım? – Dai

+0

Sağladığınız sayfayı okudum, birisinin neden bir yorumda bulunmadan açıklama yapıp yapmadığına emin değilim. Teşekkürler. –

3

Bir dizi işlev adlarını almak için PHP'nin get_defined_functions numarasını kullanabilir ve sonra bu adları önceden tanımlanmış bir biçimde filtreleyebilirsiniz. PHP dokümanlardan

Bu örnek: Böyle

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

$arr = get_defined_functions(); 

print_r($arr); 
?> 

Çıkışlar şey: daha açık kanca sistemi ile karşılaştırıldığında, ama işe yarıyor zaman

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 
     ) 

) 

Bu tür bir kabataslak bir tekniktir.

+0

+1. Ve bir yan not ile: Ayrıca tamamlayıcı kullanabilirsiniz https://github.com/AOP-PHP/AOP var. Aslında, temiz bir tasarıma sahip olduğumuzu düşünürseniz, sadece "yönelimli işlevler" i hacklemeden, yönelimli programlama kullanacaksınız, fakat OP'nin bu kadar gelişmiş olduğunu düşünmüyorum. Yine de, diğer okuyucular için iyi bilinen bir şey. Bunu kullanmak için en az bir VPS'ye ihtiyacınız vardır, çünkü AOP uzantısı standart dağıtımın bir parçası değildir. – Flavius

8

Bu nasıl drupal yapar ve bunu nasıl yapabilirsiniz. Dize birleştirme ile ad kuralı kullanın. function_exists() ve call_user_func_array() ile ayarlanmış olmalıdır. İşte

sadece

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

hangi nihayet arayacak çağırmak gerekiyor

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

nedenle (module.inc) trick yapan iki iç drupal fonksiyonları

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

Neden modifiye edildiğini bilmiyorum, ben de öyleydim - bu yüzden size bir oy verdim. – Dai

0

Neden sadece işlev kullanılmıyor? Geliştiricinin işlevi belirli bir şekilde adlandırabilir ve kanca kodları sadece mevcut olduğunu kontrol edebilir ve ardından

İlgili konular