Drupal - это «мультипарадигмальный» фреймворк, и только некоторые его части реализуют «своего рода» AOP:
- Функция render () Drupal 7, например, преобразует набор вложенных массивов в выходной HTML, выбирая соответствующие шаблоны на основе базовых правил приоритета: таким образом, Drupal ведет себя во многом как механизм преобразования XSLT, где ваша тема Файлы шаблонов, взятые вместе, составляют входной файл .xsl, а гнездо входного массива - исходный файл .xml. Это означает, что в оформлении темы есть что-то элегантно функциональное.
- Кроме того, уровень абстракции базы данных D7 близок к "прямой" ориентации объекта, хотя, как отмечает Ларри (см. Далее), в этом слое ОО имеется небольшое количество квази-АОП.
Парадигма AOP в Drupal может быть лучше визуализирована как управляемая событиями, и все это происходит через концепцию хуков Drupal. Например, когда вы делаете следующее:
- написать модуль под названием mymodule
- в mymodule.module, создайте функцию с именем
mymodule_init()
- включить этот модуль в Drupal
что вы объявляете в псевдокоде:
subscribe mymodule to "hook events" of type init
Когда ядро Drupal запускается module_invoke_all('init')
(вызывается _drupal_bootstrap_full()
- код доступен здесь ), это говорит Drupal
notify all subscribers to "hook events" of type init that this has occurred
by passing any relevant arguments to them
and letting them run the code they define in their hook_init()
Так что, хотя PHP все еще является процедурным языком - а ваш mymodule_init()
может делать все сумасшедшие, некапсулированные вещи, если вы действительно этого хотите - Drupal по-прежнему отвечает. Drupal в некотором смысле решает, стоит ли называть ваш код в первую очередь.
Таким образом, Drupal может превратить свои собственные фазы выполнения в квази-АОП, определяя
точек соединения (функции module_invoke*()
) и возможность написать свои собственные pointcuts (ваша функция mymodule_*()
. Соглашение об именах должно соответствовать имени хука Drupal.)
Для получения дополнительной информации об этом и особенно о многопарадигматической природе Drupal, попробуйте Отличный пост Ларри Гарфилда в блоге .