2009-07-01 18 views
139

¿Podría alguien proporcionar una descripción arquitectónica del flujo de control Drupal 7? Tal vez en el sentido de un diagrama de flujo sobre cómo se genera una página. ¿Qué recursos adicionales sugeriría consultar con respecto a cómo funciona Drupal?¿Cómo funciona Drupal?

+2

¡Excelente pregunta! Estuve buscando uno hace aproximadamente un año, sin suerte. – jwoolard

+1

Pregunta? Entonces, ¿por qué no lo preguntas tú mismo? :-) – liori

+0

No creo que hubiera un desbordamiento de pila en aquel entonces. :) –

Respuesta

5

aprendí cargas importando el código php drupal en un proyecto de NetBeans. Luego puede ejecutar el depurador netbeans y observar las diferentes fases de la página.

5

This (para Drupal 6) & this (para Drupal 7) es una visión general arquitectónica bastante buena de drupal. Si desea más detalles, entonces comenzaría a escribir algo más de la documentación es buena. Tratar de aprenderlo con un alto nivel de detalle sin algo concreto que lograr será mucho más difícil que probar algo.

148

Drupal puede ser confuso en este frente, en parte porque tiene una pila de funciones relativamente profundas. Aunque se trata de PHP de procedimiento, es puramente un evento/oyente impulsado en su arquitectura, y no hay un simple "flujo" en el script PHP principal para que puedas verlo. Recientemente hice a presentation on this very subject, y las diapositivas se publican en slideshare, pero un resumen rápido de alto nivel puede ser útil.

  • El archivo index.php de Drupal funciona como un controlador frontside. Toda la página se canaliza a través de ella, y la url/ruta "real" que el usuario solicitó se pasa a index.php como parámetro.
  • El sistema de enrutador de ruta de Drupal (MenuAPI) se utiliza para hacer coincidir la ruta solicitada con un módulo de complemento determinado. Ese módulo de complemento es responsable de crear el "contenido principal" de la página.
  • Una vez creado el contenido de la página principal, index.php llama al tema ('página', $ contenido), lo que pasa del contenido al sistema de tematización/despellejado de Drupal. Allí, está envuelto en barras laterales/encabezados/widgets/etc.
  • La página renderizada se devuelve a apache y se envía de vuelta al navegador del usuario.

Durante todo ese proceso, los módulos de plugins de Drupal y de terceros están desencadenando eventos y esperando que respondan. Drupal llama a esto el sistema 'gancho', y se implementa mediante convenciones de nomenclatura de funciones. El módulo 'blog', por ejemplo, puede interceptar 'usuario' relacionado al implementar una función llamada blog_user(). En el lenguaje de Drupal, se llama hook_user().

Es un poco torpe, pero debido a una peculiaridad de PHP (mantiene una tabla hash interna de todas las funciones cargadas), permite a Drupal buscar oyentes rápidamente solo por iterar sobre una lista de complementos instalados. Para cada complemento, puede llamar a function_exists() en el patrón apropiadamente nombrado y llamar a la función si existe. ("Estoy disparando el evento de" inicio de sesión. ¿Existe la función 'mymodule_login'? Lo llamaré. ¿Existe 'yourmodule_login'? ¿No? ¿Qué tal 'nextmodule_login'? ", Etc.) De nuevo, un toque raro pero funciona bastante bien

Todo lo que ocurre en Drupal ocurre a causa de uno de esos eventos que se desencadenan. El MenuAPI solo sabe sobre qué URL/rutas manejan los diferentes módulos de complementos porque activa el evento 'menú' (hook_menu) y recopila todos los módulos de complemento de metadatos con los que responden. ("Me ocuparé de las noticias de la url/reciente", y aquí está la función para llamar cuando se debe generar esa página ... ") El contenido solo se guarda porque FormAPI de Drupal es responsable de crear una página, y los incendios el evento 'se envió un formulario' para un módulo al que responder. El mantenimiento por horas ocurre porque se activa hook_cron(), y se llamará a su función a cualquier módulo con mymodulename_cron() como nombre de función.

Todo lo demás es en última instancia solo detalles: detalles importantes, pero variaciones sobre ese tema. index.php es el controlador, el sistema de menús determina qué es la "página actual" y se desencadenan muchos eventos en el proceso de creación de esa página. Los módulos de complementos pueden conectarse a esos eventos y cambiar el flujo de trabajo/suministrar información adicional/etc. Esa también es una de las razones por las que muchos recursos de Drupal se enfocan en hacer módulos. Sin módulos, Drupal no hace más que decir: "¡Alguien pidió una página! ¿Existe? ¿No? OK, voy a servir un 404. '

+1

FWIW, es un poco diferente en D7 (el tema ('página') se ha ido y los símbolos ahora están en caché en el registro del código), pero el proceso general sigue siendo el mismo. – FGM

+2

Gran explicación Eaton, Gracias por pasar el rato aquí. Mi pregunta es: ¿cómo depurar todo esto, además de poner var_dump en cada módulo para averiguar qué sucedió? –

+3

Buena pregunta. Depende de lo que estés depurando Instalar el módulo de desarrollo puede ayudar ofreciéndole algunas herramientas útiles. El paso (en la mayoría de los casos) es identificar qué módulo es responsable de construir una página determinada. hook_menu() asigna urls/paths a los módulos, por lo que puede ayudar. Luego identificando lo que hace la devolución de llamada del menú: llamar a drupal_get_form() para compilar un formulario o tema ('some_custom_thing') para compilar HTML, etc. Mire para usar funciones como drupal_alter() o module_invoke_all() que activan eventos para otros módulos, también ... – Eaton

17

La respuesta de Eaton proporciona una buena descripción. (Soy nuevo aquí, así que no puedo modificarlo, así el comentario.)

El momento brutal "aha" para mí fue darme cuenta de que todo pasa a través de index.php, y luego a través de la cascada de módulos (núcleo primero, luego por sitio). Para extender la funcionalidad central, no la reescriba. En su lugar, copie el módulo en/sites/all/modules/or/sites/[yoursite]/modules y amplíe ESO, o cree un nuevo módulo en esos lugares. Lo mismo para los temas. Los directorios de módulos también pueden contener código de visualización, en forma de tpl, css, etc.

Si está acostumbrado a hacer más estrictos los frameworks de tipo MVC como Rails, Django, etc., todo esto se vuelve un poco confuso. Los módulos pueden mezclar una gran cantidad de código de visualización, y si estás mirando módulos o plantillas de otra persona terminarás caminando hacia atrás a través de la pila. Esa es la belleza/dolor de trabajar en PHP.

Irónicamente, "solo crea una aplicación" podría ser la peor forma de aprender esto. Drupal hace tantas cosas fuera de la caja que es simplemente oscuro hasta que descubres el flujo de control. No hay nada en un archivo tpl que le indique por ejemplo dónde viene una función con un nombre divertido como l().

+0

Genial. Gracias por compartir el "aha". Ahora lo entiendo. – hobs

+0

+1 para llamar a l() 's nombre "diversión". Drupal normalmente no me hace reír. – boisvert

5

Los mejores libros sobre el tema son "Desarrollo Pro Drupal" y "Uso de Drupal".

"Pro Drupal Development" incluye varios diagramas de flujo agradables y resúmenes completos de cada una de las API de Drupal (formularios, tematización, etc.). Está destinado a ser especialmente instructivo para las personas que crean sus propios módulos y temas, pero tiene un gran valor para el desarrollador promedio experto en PHP que quiere entender a Drupal. Además de eso, he creado un módulo personalizado para cada sitio que he creado, solo para obtener un control adicional sobre cosas como ocultar selectivamente campos en varios formularios (lo que generalmente quiere hacer con el fin de simplificar los formularios de nodo para el final). usuarios), por lo que es bueno tener este conocimiento bajo tu sombrero.

"Using Drupal" está dirigido al desarrollador del sitio que quiere saber cómo crear cosas buenas, como galerías, blogs y sitios de redes sociales. Pasa por varios casos de uso y muestra cómo configurar los módulos existentes para hacer cada trabajo. En el proceso, se familiariza con los módulos complementarios esenciales "Content Construction Kit" (CCK) y "Vistas", cómo crear bloques y plantillas personalizados, y las ventajas y desventajas de mantener un sitio Drupal. Recomiendo este libro especialmente para aquellos que quieren ponerse al día y usar Drupal de inmediato. En el proceso, obtienes una comprensión de la organización interna de Drupal.

4

Depende de la comprensión que esté buscando; si tiene un buen conocimiento de php, le sugiero leer el código en sí, comenzando con index.php, y luego pasando a includes/bootstrap.inc, y luego a algunos de los otros scripts en ese directorio.

La clave incluyen archivos:

  • menu.inc es muy importante para la comprensión de cómo funciona el sistema en su conjunto, ya que maneja una gran cantidad de la asignación implícita de las direcciones URL de contenido.
  • common.inc tiene la mayoría de las funciones misteriosas que forman la base de la API.
  • module.inc maneja las invocaciones de gancho que Eaton ha mencionado
  • ofertas form.inc con pantalla de forma, presentación y tratamiento
  • theme.inc maneja presentación.

También hay alguna funcionalidad clave en los módulos/directorio; en particular, modules/node/node.module forma la base del sistema de nodo, que es en general lo que se usa para encapsular el contenido del sitio.

El código es, en general, muy comentado y claro. El uso de marcado Doxygen dentro de los comentarios significa que el código es efectivamente la documentación canónica.

También ayuda hacer esto usando un editor que puede saltar rápidamente a la definición de una función. Usar vim en combinación con ctags funciona para mí; usted tiene que decirle a ctags que indexe los archivos .inc, .module, etc. como archivos php.

4

nuevo colaborador aquí, 2 años de retraso en la conversación ;-)

En respuesta a https://stackoverflow.com/a/1070325/1154755

Para extender la funcionalidad básica no volver a escribir. En su lugar, copie el módulo en/sites/all/modules/or/sites/[yoursite]/modules y extienda ESO, o cree un nuevo módulo en esos lugares. Lo mismo para los temas.

En realidad, nunca tuve que copiar un módulo principal para actualizarlo. Drupal Hooks debería ser todo lo que necesitas.

Para temas, sí, a veces es la única manera de hacerlo, pero a menudo, puede crear un subtema para obtener el resultado que necesita.

50

Drupal Page Serving Mechanism

Para entender cómo funciona Drupal, es necesario entender la página de Drupal servir mecanismo - http://drupal.org/node/10858.

En resumen, todas las llamadas/urls/solicitudes son atendidas por index.php que carga Drupal incluyendo varios archivos/módulos de inclusión y luego llamando a la función apropiada, definida en el módulo, para atender la solicitud/url.

Aquí es un extracto del libro, Pro Desarrollo Drupal, lo que explica el proceso de arranque de la Drupal, Proceso

El Bootstrap

Drupal propio esfuerzo en cada petición al pasar por una serie de fases de arranque . Estas fases se definen en bootstrap.inc y continúan como se describe en las siguientes secciones.

Inicializar Configuración

Esta fase rellena arreglo de configuración interna de Drupal y establece la dirección URL base ($ base_url) del sitio. El archivo settings.php se analiza mediante include_once() y cualquier variable o sobrescritura de cadena establecida allí se aplica. Consulte las secciones "Modificaciones de variables" y "Modificaciones de cadena" de los sitios de archivos/all/default/default.settings.php para obtener más información.

temprana caché de página

En situaciones que requieren un alto nivel de escalabilidad, un sistema de almacenamiento en caché puede necesitar ser invocado antes incluso de que se intenta una conexión de base de datos. La primera fase del caché de página permite incluir (con include()) un archivo PHP que contiene una función llamada page_cache_ fastpath(), que toma el control y devuelve el contenido al navegador. La memoria caché de la página inicial se habilita estableciendo la variable page_cache_fastpath en TRUE, y el archivo que se incluirá se define estableciendo la variable cache_inc en la ruta del archivo. Vea el capítulo sobre el almacenamiento en caché para ver un ejemplo.

Base de datos Inicializar

Durante la fase de base de datos, el tipo de base de datos se determina, y una conexión inicial es hecho que será utilizado para las consultas de bases de datos.

nombre de host/control de acceso basado en IP

Drupal permite la prohibición de hosts sobre una base de dirección por nombre de host/IP. En la fase de control de acceso , se realiza una comprobación rápida para ver si la solicitud proviene de un host prohibido; si es así, se deniega el acceso .

Inicializar Sesión Manejo

Drupal se aprovecha de manejo de sesión integrado de PHP, pero anula algunos de los manipuladores con su propia para implementar manejo de sesión de base de datos respaldados. Las sesiones se inicializan o se restablecen en la fase de la sesión. El objeto $ usuario global que representa el usuario actual también se inicializa aquí, aunque por eficiencia no todas las propiedades están disponibles (se agregan mediante una llamada explícita a la función user_load() cuando sea necesario).

Late caché de página

En la fase de caché de páginas finales, las cargas de Drupal suficiente apoyo código para determinar si es o no para servir una página desde la caché de páginas.Esto incluye combinar la configuración de la base de datos en la matriz que se creó durante la fase de configuración de inicialización y cargar o analizar el código del módulo. Si la sesión indica que la solicitud fue emitida por un usuario anónimo y el almacenamiento en caché de la página está habilitado, la página se devuelve desde el caché y la ejecución se detiene.

de determinación del idioma

En la fase de determinación de lenguaje, soporte multilingüe de Drupal se inicializa y se toma una decisión en cuanto a qué idioma se utiliza para servir la página actual basado en la configuración del sitio y del usuario. Drupal admite varias alternativas para determinar el soporte de idioma, como el prefijo de ruta y la negociación de lenguaje a nivel de dominio.

Ruta

En la fase de ruta, el código que se encarga de caminos y se carga aliasing camino. Esta fase permite que se resuelvan las URL legibles por el hombre y maneja el caché interno de rutas de Drupal y las búsquedas .

completa

Esta fase se completa el proceso de arranque mediante la carga de una biblioteca de funciones comunes, tema apoyo, y el apoyo para el mapeo de devolución de llamada, manejo de archivos, Unicode, kits de herramientas de imagen PHP, forma creación y procesamiento, manejo de correo, tablas clasificables automáticamente y paginación del conjunto de resultados. El controlador de error personalizado de Drupal está configurado y todos los módulos habilitados están cargados. Finalmente, Drupal desencadena el enganche init, de modo que los módulos tienen la oportunidad de ser notificados antes de que comience el procesamiento oficial de la solicitud.

Una vez que Drupal ha completado el arranque, todos los componentes del marco están disponibles. Es hora de tomar la solicitud del navegador y entregarla a la función de PHP que lo manejará . El mapeo entre las URL y las funciones que las manejan se lleva a cabo utilizando un registro de devolución de llamada que se encarga tanto de la asignación de URL como del control de acceso. Los módulos registran sus devoluciones de llamada usando el menú de gancho (para más detalles, vea el Capítulo 4).

Cuando Drupal ha determinado que existe una devolución de llamada a la que se aplica correctamente la URL del navegador y que el usuario tiene permiso para acceder a esa devolución de llamada, el control pasa a la función de devolución de llamada.

Procesamiento de una petición

La función de devolución de llamada que hace cualquier trabajo que se requiere para procesar y acumular datos necesarios para cumplir con la solicitud. Por ejemplo, si se recibe una solicitud de contenido como http://example.com/ q = node/3, la URL se asigna a la función node_page_view() en node.module. El procesamiento posterior recuperará los datos para ese nodo de la base de datos y los colocará en una estructura de datos. Entonces, es hora de adorar.

tematización de los datos

Tematización implica la transformación de los datos que se ha recuperado, manipulado, o creados en HTML (o XML u otro formato de salida). Drupal utilizará el tema que el administrador ha seleccionado para darle a la página web el aspecto y la sensación correctos. El resultado resultante se envía al navegador web (u otro cliente HTTP).