2010-02-23 20 views
5

Planeo hacer una investigación sobre cómo implementar una arquitectura de plug-in en PHP. He intentado buscar en la web posibles referencias, pero pensé que tal vez mi búsqueda de una buena referencia sería más rápida y más relevante si preguntara aquí.Plugin Arquitectura en PHP

¿Alguien ha intentado aquí usar la arquitectura del complemento para proyectos web?

Gracias, plugins wordpress Erwin

Respuesta

4

que he escrito y la magia que confiar es la "función de variables de nombres". Por ejemplo, este es PHP válida, en el que será llamado el phpinfo llamada de función():

$func_name="phpinfo"; 
$func_name(); 

Esto permite que las llamadas desarrollador para la función "gancho", como en los de anulación con sus propias funciones sin tener cambiar el resto de la aplicación. Los módulos de Kernel de Linux se tratan de "enganchar", no funcionarían sin este comportamiento.

Lamentablemente, los nombres de las funciones variables PHP son un truco desagradable que consume muchos recursos. Todas las funciones en un espacio de nombre se ponen en una lista y esta lista debe ser buscada antes de llamar a la función, esto es O (log2 (n)). También tenga en cuenta que los nombres de funciones variables no se pueden acelerar correctamente en HipHop, aunque el código aún se transformará en C++ válido. Un mejor enfoque sería volver a declarar las funciones como se puede en Python que sería O (1) complejidad, pero el equipo de desarrollo de PHP HATES esta idea (Sí, he pedido esta función).

¡Buena suerte!

+3

Este es un método horrible IMO. – davr

+0

@davr: ¿Por qué? Mientras esto esté explícito y documentado, y está claro que es el comportamiento correcto, está completamente bien. En una analogía, es lo mismo que delegados (en C#). –

+5

@davr Si puede encontrar una solución mejor, toda la comunidad PHP le encantaría escucharla. – rook

0

Puede ver cómo Zend Framework implementó su componente Plugin Loader.

Básicamente estableces las rutas a donde se almacenan los complementos y el cargador intenta cargar el primer complemento encontrado de una manera LIFO.

+0

Claro, lo haré. ¡Gracias! – Erwin

0

¿Qué hay de estas dos clases

  1. plugin de manejo/cargador
  2. Plugin

y hay algunas reglas

  1. plugin de manejo/Loader es una clase Singleton y gestiona todas las clases secundarias de la clase de complemento.
  2. Cualquier complemento debe heredarse de la clase de complemento.
  3. La clase de complemento tendría propiedades y métodos predefinidos que se pueden sobrescribir por sus clases secundarias, por lo que el método alternativo para enganchar el sistema (pero no estoy seguro de ninguna diferencia importante en los resultados).

Por ejemplo, decir que la clase Plugin tiene una propiedad de url_routes con valor predeterminado de una matriz vacía, la clase secundaria puede sobrescribir y agregar las URL requeridas en esta matriz.

Plugin Handler/Loader agregará estas rutas de URL desde la clase secundaria al sistema subyacente.

0

no se olvide de la función __autoload. puedes cargar componentes dinámicamente como:

SomeModule::test(); 

function __autoload($class) 
{ 
    $class = preg_replace('/^\W/', '', strtolower($class)); 
    include 'modules/'.$class.'.php'; 
} 
1

Hay una gran cantidad de conceptos que se puede considerar un 'plug-in'. Puede escribir un sistema de plugins usando: