¿Cómo maneja Drupal la carga automática de clases?


10

¿Cómo maneja Drupal la carga automática de clases a través de módulos? Por ejemplo, si tengo un módulo de Eventos, y declaro una clase llamada Evento, y luego en el archivo .info incluyo el archivo de clase, ¿cómo se registra esto?

El problema es que estoy tratando de obtener dinámicamente una matriz que contenga todos los nombres de clase cargados. get_declared_classes () no devuelve los nombres de todas mis clases declaradas de esta manera, por lo que supongo que de alguna manera se cargan automáticamente. Siguiendo las sugerencias de otra pregunta de desbordamiento de la pila, intenté obtenerlas todas con spl_autoload_functions () , pero eso tampoco fue exitoso.

¿Algunas ideas?

Respuestas:


13

Todos los archivos enumerados en archivos .info se analizan cuando se reconstruyen los módulos (solo los archivos modificados / nuevos en esa lista son, por razones de rendimiento).

Esa información se almacena en las tablas {registry}y {registry_files}. Entonces, si desea obtener todas las clases o aquellas de acuerdo con un patrón de nomenclatura dado, puede consultar esas tablas.


7

Drupal mantiene un registro de código y lo usa para su autocargador de clases. Para llenar este registro con las clases de su módulo, debe agregar sus archivos a la entrada de archivos [] en su archivo .info:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

La carga automática de clase de PHP se asegurará de que el archivo de clase principal también se cargue.

Gracias al usuario pier-buyle por esta respuesta, vea su respuesta original aquí para la misma pregunta.

Espero que ayude


5

spl_autoload_functions()devuelve la lista de las funciones de carga automática que se han registrado con spl_autoload_register(). Drupal registra dos funciones de carga automática: una para las clases ( drupal_autoload_class () ) y otra para las interfaces ( drupal_autoload_interface () ).

Ambas funciones usan _registry_check_code () ; utilizando su código, puede escribir una función que enumere todas las clases implementadas por los módulos Drupal 7.


3

Si ha agregado una entrada a la matriz de archivos [] del archivo .info, deberá ir a la sección de administración de sus módulos y hacer clic en "guardar configuración". Esto obtendrá drupal para actualizar la información .info, y se registrarán las nuevas entradas.


1

Descubrí que declarar mis archivos de inclusión en el archivo de información no los reconoce cuando comienzo a ejecutar el módulo. Si tengo un evento de clase en el archivo event.inc. pero crea un objeto en el módulo, no se reconoce. Agrego la linea

include_once ('CMatArticleHandler.inc');

antes del $ variable = nuevo evento (); línea. Soy nuevo en esto, así que puede haber más que esto, pero ha funcionado hasta ahora.


1
Realmente desafortunado que la gente simplemente rechace esto en lugar de explicar qué hacer para evitar tener que hacerlo. Estoy en la misma situación: el autocargador de Drupal no reconoce constantemente la necesidad de cargar un archivo para obtener una clase.
Greggles

Es necesario borrar el registro al agregar nuevas clases. Una manera fácil de hacer othis a través de drush es con este comando: drupal.org/project/registry_rebuild
stefgosselin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.