2012-09-18 8 views
6

Sto cercando di capire come costruire un sistema di aggancio molto simile a quello utilizzato da Drupal. Con Drupal puoi semplicemente nominare una funzione in un certo modo e verrà automaticamente invocato come un hook se il modulo è abilitato.Come potrei creare un semplice sistema di hook php che funzioni in questo modo?

Ho esaminato le altre risposte qui su Stackoverflow, ma nessuno di loro fornisce una risposta su come creare questo tipo di funzionalità in un'applicazione PHP.

+0

Guardare Drupal e decodificarlo? –

+0

@Paul In realtà l'ho fatto, ma Drupal ha un bel po 'più di funzionalità di cui ho realmente bisogno, e non è molto chiaro cosa stia effettivamente gestendo il sistema Hook. –

risposta

2

Non ho dimestichezza con interni Drupal, ma probabilmente lo fa utilizzando la riflessione:

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

Si potrebbe includere la pagina PHP che contiene le funzioni gancio, quindi utilizzare la riflessione per trovare funzioni o di classe metodi che corrispondono a una determinata convenzione di denominazione, quindi salvare i puntatori di funzione per chiamare tali funzioni quando appropriato (come gli eventi nel ciclo di vita di un modulo).

+0

Perché ho votato in ribasso? – Dai

+0

Sto leggendo la pagina che hai fornito, non sono sicuro del motivo per cui qualcuno potrebbe votarti senza lasciare un commento che spieghi. Grazie. –

3

È possibile utilizzare PHP get_defined_functions per ottenere un array di stringhe di nomi di funzioni, quindi filtrare tali nomi con un formato predefinito.

Questo esempio dalla documentazione PHP:

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

$arr = get_defined_functions(); 

print_r($arr); 
?> 

uscite qualcosa di simile:

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 
     ) 

) 

È un po 'una tecnica abbozzato se confrontato con un sistema di aggancio più esplicita, ma funziona.

+0

+1. E con una nota a margine: c'è anche https://github.com/AOP-PHP/AOP che potresti usare in modo complementare a questo. In realtà, penso in un design pulito, useresti solo la programmazione orientata all'aspetto, senza questo hack con "funzioni definite", ma non penso che l'OP sia così avanzato. Tuttavia, è una buona conoscenza per gli altri lettori. È necessario almeno un VPS per utilizzarlo, poiché l'estensione AOP non fa parte della distribuzione standard. – Flavius

8

Ecco come funziona drupal e come è possibile farlo. Utilizzo della concatenazione di stringhe con la convenzione dei nomi. Con function_exists() e call_user_func_array() dovresti essere tutto pronto.

Qui ci sono le due funzioni Drupal interne che lo rendono il trucco (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); 
} 

Pertanto, avete solo bisogno di invocare

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

che finalmente chiamare

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

Non so perché sei stato modded down, lo ero anche io - quindi ti ho dato un voto in rialzo. – Dai

0

Perché non usare solo la funzione esiste? Lo sviluppatore potrebbe nominare la funzione in un certo modo, e i codici di aggancio controllano che esistano e li chiamano

Problemi correlati