2008-09-24 19 views
5

Jak działa AOP (programowanie zorientowane na aspekt) w Drupal. Dowiedziałem się o AOP pod względem wykorzystania go do logowania i bezpieczeństwa, ale jak to ma zastosowanie do Druoala?Jak działa AOP w Drupal?

Odpowiedz

4

Drupal naśladuje paradygmaty AOP za pomocą haków, które w zasadzie pozwalają programistom na tkanie w bitach kodu podczas wykonywania operacji. możesz rzucić okiem na haki, które programista może zaimplementować: here.

jako szybki przykład, gdy tworzyłem nowy moduł oparty na węźle (węzły stanowiące podstawową formę danych w drupalu), mam natychmiastowy dostęp do komentarzy i taksonomii bez żadnej dodatkowej pracy z mojej strony. moduły komentarzy i taksonomii mają możliwość przechwytywania do węzłów i zapewniają tę dodatkową funkcjonalność. więc w tym sensie nie muszę uwzględniać takich funkcji w moim programie, ale jestem w stanie wykorzystać tę elastyczność.

1

Drupal jest "multi-paradigm" ramy, a tylko pewne fragmenty to osiągnąć "rodzaj" AOP:

  • Drupal 7 na renderowania() funkcji, na przykład, konwertuje zagnieżdżonymi tablic do wyjściowego kodu HTML, wybierając odpowiednie szablony oparte na podstawowych regułach pierwszeństwa: w ten sposób Drupal zachowuje się podobnie do silnika przekształceń XSLT, w którym pliki szablonu tematu razem wzięte stanowią wejściowy plik .xsl, a gniazdo tablicy wejściowej jest początkowe. plik xml. Oznacza to, że istnieje coś elegancko funkcjonującego w sposobie działania kompozycji.
  • Ponadto warstwa abstrakcji bazy danych D7 jest zbliżona do "prostej" orientacji obiektu, chociaż jak zauważa Larry (patrz dalej), w tej warstwie OO występuje niewielka ilość quasi-AOP.

Paradygmat AOP Drupala może być lepiej zwizualizowany jako napędzany zdarzeniami, a dzieje się tak dzięki koncepcji haków Drupala. Na przykład, kiedy należy wykonać następujące czynności:

  • napisać moduł o nazwie mymodule
  • w mymodule.module utworzyć funkcję o nazwie mymodule_init()
  • włączyć ten moduł w Drupal

kim jesteś deklaracja jest pseudokodem:

subscribe mymodule to "hook events" of type init 

Kiedy rdzeń Drupala następnie działa module_invoke_all('init') (zwany w _drupal_bootstrap_full() - code available here) jest to Drupal mówiąc

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() 

Więc gdy PHP jest jeszcze język proceduralny - a mymodule_init() może zrobić wszelkiego rodzaju szalonych, niekapsułkowanych rzeczy jeśli naprawdę chciał - Drupal jest nadal odpowiedzialny za . Drupal w pewnym sensie decyduje, czy zadzwonić na swój kod w pierwszej kolejności.

W ten sposób, Drupal jest w stanie zamienić swoje fazy wykonawcze do quasi-AOP, definiując wspólnych punktów (Funkcje module_invoke*()) i pozwalając pisać własne punktów przekroju (czynność mymodule_*(). Którego nazewnictwo Konwencja musi pasować do nazwy haka Drupala.)

Aby uzyskać więcej informacji na ten temat, a także na temat wieloparadygmatycznej natury Drupala, spróbuj Larry Garfield's excellent blogpost.