it-roy-ru.com

Как Drupal работает?

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

149
alice

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

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

В течение всего этого процесса Drupal и ​​сторонние подключаемые модули запускают события и ожидают их ответа. Drupal называет это системой 'hook', и она реализована с использованием соглашений об именах функций. Например, модуль "блог" может перехватывать "пользователя", связанного с реализацией функции с именем 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.

156
Eaton

Drupal Page Serving Mechanism

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

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

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

Процесс Bootstrap

Drupal запускается при каждом запросе, выполняя серию фаз bootstrap. Эти фазы определены в 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 кэширование и поиск путей.

Full

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

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

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

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

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

Тематизация данных

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

58
amitgoyal

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

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

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

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

20
axoplasm

http://drupal.org/handbooks

Прочитайте руководства, особенно руководство разработчика темы. Drupal поддерживает несколько движков тем. Zen использует phptemplate, поэтому обратите внимание на эту часть руководства.

Для разработки модуля API документирован на api.drupal.org.

особенно когда вам нужно быстро и быстро получить информацию http://www-128.ibm.com/developerworks/ibm/osource/implement.html

9
joe

Это зависит от того, насколько глубокое понимание вы ищете; если вы хорошо разбираетесь в 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.

7
intuited

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

5
Ben Hammond

Лучшие книги по этой теме: "Pro Drupal Development" и "Использование Drupal".

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

"Использование Drupal" предназначено для разработчиков сайтов, которые хотят знать, как создавать хорошие вещи, такие как галереи, блоги и сайты социальных сетей. В нем рассматриваются несколько вариантов использования и показано, как настроить существующие модули для выполнения каждой работы. В процессе он знакомит вас с необходимыми дополнительными модулями "Content Construction Kit" (CCK) и "Views", как создавать пользовательские блоки и шаблоны, а также с подробностями о поддержке Drupal. _ сайт. Я рекомендую эту книгу, особенно для тех, кто хочет быстро освоиться и действительно ИСПОЛЬЗОВАТЬ Drupal. В процессе вы получаете понимание внутренней организации Drupal.

5
Scott Lahteine

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

5
Jeremy French

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

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

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

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

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

4
Robin Millette