Как работает Drupal? [закрыто]


151

Может ли кто-нибудь предоставить обзор архитектуры потока управления Drupal 7? Возможно, в смысле блок-схемы о том, как генерируется страница. Какие дополнительные ресурсы вы бы посоветовали проконсультировать относительно работы Drupal?


1
Вопрос? Тогда почему ты не спросил это сам :-)
liori

Я не думаю, что тогда было переполнение стека. :)
Джереми Французский

2
Сообщество Drupal всегда ищет людей, которые помогут с документацией. Почему бы не помочь, если документация неуклюжа или учебники неубедительны? :)
Rimian

4
документирование требует понимания .. что требует документации или большого опыта
Дэймон

Ответы:


160

Drupal может сбить с толку на этом фронте, отчасти потому, что у него относительно глубокий стек функций. Хотя это процедурный PHP, он основан исключительно на событиях / слушателях в своей архитектуре, и в основном сценарии PHP нет простого «потока», который вы могли бы посмотреть. Я недавно сделал презентацию на эту тему , и слайды размещены на слайд-шоу, но может быть полезным краткое резюме высокого уровня.

  • Файл index.php в Drupal функционирует в качестве внешнего контроллера. Через него проходят все страницы, а «фактический» URL / путь, запрошенный пользователем, передается в index.php в качестве параметра.
  • Система маршрутизации пути Drupal (MenuAPI) используется для соответствия запрошенного пути к данному модулю плагина. Этот модуль плагина отвечает за создание «основного контента» страницы.
  • После создания основного содержимого страницы index.php вызывает тему ('page', $ content), которая передает содержимое в систему тем / скинов Drupal. Там он упакован в боковые панели / заголовки / виджеты / и т.д ..
  • Отрендеренная страница затем возвращается в apache и отправляется обратно в браузер пользователя.

В течение всего этого процесса модули плагинов Drupal и сторонних производителей запускают события и ожидают их ответа. Drupal называет это системой «ловушки», и она реализована с использованием соглашений об именах функций. Например, модуль «блог» может перехватывать «пользователя», связанного с реализацией функции с именем blog_user (). На языке Drupal это называется hook_user () .

Это немного неуклюже, но из-за особенностей PHP (он сохраняет внутреннюю хеш-таблицу всех загруженных функций), он позволяет Drupal быстро проверять прослушиватели, просто перебирая список установленных плагинов. Для каждого плагина он может вызывать функцию function_exists () с соответствующим именем шаблона и вызывать функцию, если она существует. («Я запускаю событие 'login'. Существует ли функция 'mymodule_login'? Я назову ее. Существует ли 'yourmodule_login'? Нет? Как насчет 'nextmodule_login'?" И т. Д.) ». И снова, прикосновение неуклюже, но это работает довольно хорошо

Все, что происходит в Drupal, происходит из-за одного из этих событий. MenuAPI знает только о том, какие URL / пути обрабатываются различными модулями плагинов, потому что он запускает событие 'menu' (hook_menu) и собирает все модули плагинов метаданных, на которые отвечают. («Я позабочусь о URL« news / недавний », и вот функция, вызываемая, когда эта страница должна быть построена ...») Содержимое сохраняется только потому, что FormAPI Drupal отвечает за создание страницы и запускает событие «форма была отправлена» для ответа от модуля. Почасовое обслуживание происходит потому, что срабатывает hook_cron (), и любой модуль с mymodulename_cron () в качестве имени функции будет вызывать свою функцию.

Все остальное в конечном итоге просто детали - важные детали, но вариации на эту тему. index.php - это контроллер, система меню определяет, что такое «текущая страница», и в процессе создания этой страницы запускается множество событий. Модули плагинов могут подключаться к этим событиям и изменять рабочий процесс / предоставлять дополнительную информацию / и т.д. Это также одна из причин того, что многие ресурсы Drupal сосредоточены на создании модулей. Без модулей Drupal на самом деле ничего не делает, кроме как сказать: «Кто-то попросил страницу! Это существует? Нет? Хорошо, я подам 404.


1
FWIW, в D7 все немного по-другому (тема ('page') исчезла, и теперь символы кэшируются в реестре кода), но общий процесс остается тем же.
FGM

2
Отличное объяснение Eaton, Спасибо, что вывешены здесь. Мой вопрос к вам, как вы отлаживаете все это, кроме помещения var_dump в каждый модуль, чтобы узнать, что случилось?
Брайан Дж

3
Хороший вопрос. Это зависит от того, что вы отлаживаете. Установка модуля devel может помочь, предоставив вам несколько полезных инструментов. Шаг (в большинстве случаев) - определить, какой модуль отвечает за создание данной страницы. hook_menu () отображает URL / пути к модулям, так что это может помочь. Затем определяя, что делает его обратный вызов в меню - вызывая drupal_get_form () для создания формы, или тему ('some_custom_thing') для построения HTML и т. Д., Следите за использованием таких функций, как drupal_alter () или module_invoke_all (), которые запускают события для других модули тоже ...
Итон

Я нашел это супер полезным. Знаете ли вы, чем отличается Drupal 7?
Hortitude

Обновление D7: (см. Также) drupal.org/node/350780
dreftymac

63

Механизм обслуживания страниц Drupal

Чтобы понять, как работает Drupal, вам нужно понять механизм обслуживания страниц Drupal.

Вкратце, все вызовы / URL-адреса / запросы обслуживаются index.php, который загружает Drupal, включая различные включаемые файлы / модули, а затем вызывает соответствующую функцию, определенную в модуле, для обслуживания запроса / URL-адреса.

Вот выдержка из книги Pro Drupal Development, которая объясняет процесс начальной загрузки Drupal,

Процесс начальной загрузки

Drupal запускается при каждом запросе, проходя серию этапов начальной загрузки. Эти фазы определены в bootstrap.inc и выполняются, как описано в следующих разделах.

Инициализировать конфигурацию

Эта фаза заполняет массив внутренней конфигурации Drupal и устанавливает базовый URL ($ base_url) сайта. Файл settings.php анализируется с помощью include_once (), и применяются любые установленные здесь переменные или переопределения строк. Подробности смотрите в разделах «Переопределения переменных» и «Переопределения строк» ​​в файле sites / all / default / default.settings.php.

Ранний кэш страницы

В ситуациях, требующих высокого уровня масштабируемости, система кэширования может потребоваться вызвать еще до попытки подключения к базе данных. Фаза раннего кэширования страниц позволяет включать (с помощью include ()) файл PHP, содержащий функцию page_cache_ fastpath (), которая берет на себя и возвращает содержимое в браузер. Ранний кеш страниц включается установкой переменной page_cache_fastpath в значение TRUE, а включаемый файл определяется путем установки переменной cache_inc по пути к файлу. Смотрите главу о кешировании для примера.

Инициализировать базу данных

На этапе базы данных определяется тип базы данных и устанавливается начальное соединение, которое будет использоваться для запросов к базе данных.

Хост / IP-контроль доступа

Drupal позволяет запрещать хосты на основе имени хоста / IP-адреса. На этапе контроля доступа выполняется быстрая проверка, чтобы убедиться, что запрос поступил от запрещенного хоста; если это так, доступ запрещен.

Инициализировать обработку сеанса

Drupal использует встроенную обработку сессий PHP, но переопределяет некоторые из обработчиков своими собственными для реализации обработки сессий на основе базы данных. Сеансы инициализируются или восстанавливаются на этапе сеанса. Здесь также инициализируется глобальный объект $ user, представляющий текущего пользователя, хотя для эффективности не все свойства доступны (они добавляются явным вызовом функции user_load () при необходимости).

Кэш поздней страницы

На поздней стадии кэширования страниц Drupal загружает достаточно вспомогательного кода, чтобы определить, следует ли обслуживать страницу из кэша страниц. Это включает в себя объединение настроек из базы данных в массив, созданный на этапе инициализации конфигурации, и загрузку или анализ кода модуля. Если сеанс указывает, что запрос был выполнен анонимным пользователем, и кэширование страницы включено, страница возвращается из кэша, и выполнение останавливается.

Определение языка

На этапе определения языка инициализируется многоязычная поддержка Drupal, и принимается решение о том, какой язык будет использоваться для обслуживания текущей страницы на основе настроек сайта и пользователя. Drupal поддерживает несколько альтернатив для определения языковой поддержки, таких как префикс пути и согласование языка на уровне домена.

Дорожка

На этапе пути загружается код, который обрабатывает пути и псевдонимы путей. Эта фаза позволяет разрешать понятные человеку URL-адреса и обрабатывает внутреннее кэширование и поиск путей в Drupal.

Полный

На этом этапе завершается процесс начальной загрузки путем загрузки библиотеки общих функций, поддержки тем и поддержки сопоставления обратных вызовов, обработки файлов, Unicode, наборов инструментов PHP-изображений, создания и обработки форм, обработки почты, автоматически сортируемых таблиц и подкачки результирующих наборов. Пользовательский обработчик ошибок Drupal установлен, и все включенные модули загружены. Наконец, Drupal запускает ловушку init, чтобы модули имели возможность получать уведомления до начала официальной обработки запроса.

После завершения начальной загрузки Drupal доступны все компоненты фреймворка. Настало время принять запрос браузера и передать его функции PHP, которая его обработает. Сопоставление между URL-адресами и функциями, которые их обрабатывают, осуществляется с помощью реестра обратных вызовов, который заботится как о сопоставлении URL-адресов, так и об управлении доступом. Модули регистрируют свои обратные вызовы, используя меню (подробнее см. Главу 4).

Когда Drupal определил, что существует обратный вызов, с которым URL-адрес запроса браузера успешно сопоставлен и что у пользователя есть разрешение на доступ к этому обратному вызову, управление передается функции обратного вызова.

Обработка запроса

Функция обратного вызова выполняет любую работу, необходимую для обработки и накопления данных, необходимых для выполнения запроса. Например, если получен запрос на контент, такой как http://example.com/ q = node / 3, URL-адрес сопоставляется с функцией node_page_view () в node.module. Дальнейшая обработка извлечет данные для этого узла из базы данных и поместит их в структуру данных. Тогда пришло время для темы.

Тематические данные

Тематика включает в себя преобразование данных, которые были извлечены, обработаны или созданы в HTML (или XML или другой выходной формат). Drupal будет использовать тему, выбранную администратором, чтобы придать веб-странице правильный внешний вид. Полученный результат затем отправляется в веб-браузер (или другой HTTP-клиент).


20

Ответ Итона дает хороший обзор. (Я новичок здесь, поэтому я не могу изменить его, поэтому комментарий.)

Жестоким моментом «ага» для меня было осознание того, что все происходит через index.php, а затем через водопад модулей (сначала ядро, затем сайт). Чтобы расширить функциональность ядра, не переписывайте его. Вместо этого скопируйте модуль в / sites / all / modules / или / sites / [yoursite] / modules и расширьте ТО или создайте новый модуль в этих местах. То же самое для тем. Каталоги модулей также могут содержать отображаемый код в виде tpl, css и т. Д.

Если вы привыкли к более строгим средам типа MVC, таким как Rails, Django и т. Д., Все это немного сбивает с толку. Модули могут смешивать большое количество отображаемого кода, и если вы посмотрите на чьи-то модули или шаблоны, вы в конечном итоге окажетесь в стеке. В этом вся прелесть работы в PHP.

По иронии судьбы, «просто создать приложение» может быть худшим способом узнать это. Drupal делает так много из коробки, что просто неясен, пока вы не выясните поток управления. В файле tpl нет ничего, что бы указывало, например, откуда взялась функция с забавным именем, например l ().


7

Это зависит от того, насколько глубокое понимание вы ищете; если вы хорошо разбираетесь в php, я бы посоветовал прочитать сам код, начиная с index.php, а затем перейти к include / bootstrap.inc, а затем к некоторым другим скриптам в этом каталоге.

Ключ включает файлы:

  • menu.inc очень важен для понимания того, как работает система в целом, поскольку он обрабатывает многие неявные преобразования URL-адресов в контент.
  • common.inc имеет большинство загадочных функций, которые составляют основу API.
  • module.inc обрабатывает вызовы ловушек, упомянутые Итоном
  • form.inc имеет дело с отображением, отправкой и обработкой формы
  • theme.inc обрабатывает презентацию.

В каталоге modules / есть некоторые ключевые функции; в частности, модуль / узел / узел.модуль формирует основу системы узлов, которая в целом используется для инкапсуляции содержимого сайта.

Код, в общем, очень хорошо прокомментирован и понятен. Использование разметки Doxygen в комментариях означает, что код фактически является канонической документацией.

Это также помогает сделать это с помощью редактора, который может быстро перейти к определению функции. Использование vim в сочетании с ctags работает для меня; Вы должны указать ctags индексировать файлы .inc, .module и т. д. как файлы php.


5

Я изучил нагрузки, импортировав код drupal .php в проект NetBeans. Затем вы можете запустить отладчик netbeans и посмотреть, как разные фазы страницы объединяются.


5

Лучшие книги на эту тему - «Pro Drupal Development» и «Using Drupal».

«Pro ​​Drupal Development» включает в себя несколько хороших блок-схем и подробные описания каждого из API-интерфейсов Drupal (формы, темы и т. Д.). Он предназначен, чтобы быть особенно поучительным для людей, делающих свои собственные модули и темы, но имеет большую ценность для среднего PHP-опытного разработчика, который хочет понять Drupal. Помимо этого, я создал собственный модуль для каждого сайта, который я создал, просто чтобы получить дополнительный контроль над такими вещами, как выборочное скрытие полей в различных формах (что обычно требуется сделать для упрощения форм узлов для конечных целей). пользователи), так что хорошо иметь эти знания под рукой.

«Использование Drupal» предназначено для разработчиков сайтов, которые хотят знать, как создавать хорошие вещи, такие как галереи, блоги и сайты социальных сетей. В нем рассматриваются несколько вариантов использования и показано, как настроить существующие модули для выполнения каждой работы. В процессе он знакомит вас с необходимыми дополнительными модулями «Content Construction Kit» (CCK) и «Views», как создавать пользовательские блоки и шаблоны, а также с подробностями обслуживания сайта Drupal. Я рекомендую эту книгу, особенно для тех, кто хочет быстро освоиться и сразу же использовать Drupal. В процессе вы получаете понимание внутренней организации Drupal.


5

Это (для Drupal 6) и это (для Drupal 7) - довольно хороший обзор архитектуры Drupal. Если вы хотите больше подробностей, я бы начал писать что-то, что большая часть документации хороша. Попытка изучить его с высокой степенью детализации без каких-либо конкретных достижений будет намного сложнее, чем попытка чего-либо.


4

Новый участник здесь, 2 года опоздал на разговор ;-)

Ответ на https://stackoverflow.com/a/1070325/1154755

Чтобы расширить функциональность ядра, не переписывайте его. Вместо этого скопируйте модуль в / sites / all / modules / или / sites / [yoursite] / modules и расширьте ТО или создайте новый модуль в этих местах. То же самое для тем.

На самом деле, мне никогда не приходилось копировать основной модуль для его обновления. Drupal Hooks должен быть всем, что вам нужно.

Для тем, да, иногда это единственный путь, но часто вы можете создать подтему, чтобы получить нужный вам результат.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.