Как АОП работает в Drupal? - PullRequest
       25

Как АОП работает в Drupal?

5 голосов
/ 25 сентября 2008

Как работает AOP (Аспектно-ориентированное программирование) в Drupal. Я узнал об АОП с точки зрения использования его для ведения журнала и безопасности, но как это относится к Druoal?

Ответы [ 2 ]

4 голосов
/ 25 сентября 2008

drupal подражает парадигмам AOP через ловушки, которые в основном позволяют разработчикам вплетать биты кода во время выполнения. вы можете взглянуть на хуки, которые разработчик может реализовать здесь .

В качестве быстрого примера, если бы я разрабатывал новый модуль на основе узлов (узлы были основной формой данных в drupal), у меня был бы мгновенный доступ к комментариям и таксономии без дополнительной работы с моей стороны. Модули комментариев и таксономии имеют возможность подключаться к узлам и предоставляют дополнительную функциональность. поэтому в этом смысле мне не нужно учитывать такие функции в моей программе, но я могу воспользоваться этой гибкостью.

2 голосов
/ 11 июля 2012

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, попробуйте Отличный пост Ларри Гарфилда в блоге .

...