Drupal은 어떻게 작동합니까? [닫은]


151

누군가 Drupal 7 제어 흐름의 아키텍처 개요를 제공 할 수 있습니까? 페이지 생성 방법에 대한 플로우 차트의 의미 일 수 있습니다. Drupal의 작동 방식과 관련하여 어떤 추가 리소스를 통해 컨설팅을 제안 하시겠습니까?


1
질문? 그렇다면 왜 스스로에게 묻지 않으
셨나요?

그때 스택 오버플로 방법이 있다고 생각하지 않습니다. :)
Jeremy French

2
Drupal 커뮤니티는 항상 문서를 도울 사람들을 찾고 있습니다. 문서가 서 투르거나 튜토리얼이 절름발이가 되어도 도움이되지 않겠습니까? :)
Rimian

4
문서화에는 이해가 필요합니다. 문서
Damon

답변:


160

Drupal은 상대적으로 깊은 기능 스택을 가지고 있기 때문에이 정면에서 혼란 스러울 수 있습니다. 절차적인 PHP이지만 순전히 이벤트 / 리스너 아키텍처로 구동되며, 메인 PHP 스크립트에는 간단한 "흐름"이 없습니다. 최근 에이 주제에 대한 프레젠테이션을 했으며 슬라이드가 슬라이드 공유에 게시되었지만 빠른 요약 정보가 유용 할 수 있습니다.

  • Drupal의 index.php 파일은 프론트 사이드 컨트롤러로 작동합니다. 모든 페이지가이 페이지를 통해 파이프되고 사용자가 요청한 "실제"URL / 경로가 index.php에 매개 변수로 전달됩니다.
  • Drupal의 경로 라우터 시스템 (MenuAPI)은 요청 된 경로를 지정된 플러그인 모듈과 일치시키는 데 사용됩니다. 해당 플러그인 모듈은 페이지의 "기본 컨텐츠"를 작성합니다.
  • 기본 페이지 컨텐츠가 빌드되면 index.php는 theme ( 'page', $ content)를 호출하여 Drupal의 테마 / 스킨 시스템으로 컨텐츠를 전달합니다. 사이드 바 / 헤더 / 위젯 등으로 싸여 있습니다.
  • 렌더링 된 페이지는 아파치로 다시 전달되고 사용자의 브라우저로 다시 전송됩니다.

전체 프로세스 중에 Drupal 및 타사 플러그인 모듈은 이벤트를 발생시키고 응답을 수신합니다. Drupal은 이것을 '후크'시스템이라고하며, 기능 명명 규칙을 사용하여 구현됩니다. 예를 들어 'blog'모듈은 blog_user ()라는 함수를 구현하여 'user'와 관련된 'intercept'를 차단할 수 있습니다. Drupal 용어에서는 hook_user () 라고 합니다.

약간 어색하지만 PHP 쿼크 (로드 된 모든 함수의 내부 해시 테이블을 유지)로 인해 Drupal은 설치된 플러그인 목록을 반복하여 청취자를 빠르게 확인할 수 있습니다. 각 플러그인에 대해 적절하게 명명 된 패턴에서 function_exists ()를 호출하고 존재하는 경우 함수를 호출 할 수 있습니다. ( " 'login'이벤트를 시작합니다. 'mymodule_login'기능이 존재합니까? 전화하겠습니다. 'yourmodule_login'이 존재합니까? 아니요? 'nextmodule_login'은 어떻습니까?"등) 꽤 잘 작동합니다.

Drupal에서 일어나는 모든 일은 그 사건 중 하나 때문에 발생합니다. MenuAPI는 'menu'이벤트 (hook_menu)를 발생시키고 응답하는 모든 메타 데이터 플러그인 모듈을 수집하기 때문에 다른 플러그인 모듈이 처리하는 URL / 경로 만 알고 있습니다. ( "URL 'news / recent'를 처리하고 여기에 해당 페이지를 빌드해야 할 때 호출하는 기능이 있습니다 ...") Drupal의 FormAPI가 페이지 작성을 담당하고 있기 때문에 컨텐츠 만 저장됩니다. 모듈이 응답 할 '양식이 제출되었습니다'이벤트. hook_cron ()이 트리거되어 시간별 유지 보수가 발생하며, 함수 이름으로 mymodulename_cron ()이있는 모든 모듈에는 해당 함수가 호출됩니다.

다른 모든 것은 궁극적으로 세부 사항입니다. 중요한 세부 사항이지만 해당 주제의 변형입니다. index.php는 컨트롤러이며, 메뉴 시스템은 "현재 페이지"가 ​​무엇인지를 결정하며, 해당 페이지를 작성하는 과정에서 많은 이벤트가 발생합니다. 플러그인 모듈은 이러한 이벤트에 연결하여 워크 플로우 / 공급 추가 정보 등을 변경할 수 있습니다. 많은 Drupal 리소스가 모듈을 만드는 데 주력하는 이유이기도합니다. 모듈이 없으면 Drupal은 실제로 '누군가 페이지를 요청했습니다! 존재합니까? 아니? 좋아, 나는 404를 제공 할 것이다. '


1
FWIW, D7에서는 약간 다르지만 (테마 ( 'page')가 사라지고 기호가 코드 레지스트리에 캐시됩니다) 전체 프로세스는 동일하게 유지됩니다.
FGM

2
훌륭한 설명 Eaton, 여기에 놀아 주셔서 감사합니다. 내 질문은 무슨 일이 있었는지 알기 위해 각 모듈에 var_dump를 넣는 것 외에 어떻게이 모든 것을 디버깅합니까?
Brian G

3
좋은 질문. 디버깅하는 대상에 따라 다릅니다. devel 모듈을 설치하면 유용한 도구를 제공 할 수 있습니다. 단계 (대부분의 경우)는 주어진 페이지를 작성하는 모듈을 식별하는 것입니다. hook_menu ()는 URL / 경로를 모듈에 매핑하므로 도움이 될 수 있습니다. 그런 다음 메뉴 콜백이 수행하는 작업 식별-drupal_get_form ()을 호출하여 양식 작성 또는 theme ( 'some_custom_thing')을 작성하여 HTML 작성 등 drupal_alter () 또는 module_invoke_all ()과 같은 기능을 사용하여 다른 이벤트를 트리거합니다. 모듈도 ...
Eaton

나는 이것이 매우 도움이된다는 것을 알았다. Drupal 7이 어떻게 다른지 아십니까?
Hortitude 2018

D7 업데이트 : (참조) drupal.org/node/350780
dreftymac

63

드루팔 페이지 서빙 메커니즘

Drupal의 작동 방식을 이해하려면 Drupal의 페이지 제공 메커니즘을 이해해야합니다.

요컨대, 모든 호출 / url / 요청은 index.php에 의해 제공되며, 다양한 include 파일 / 모듈을 포함하고 모듈에 정의 된 적절한 함수를 호출하여 요청 / url을 제공함으로써 Drupal을로드합니다.

다음은 Drupal의 부트 스트랩 프로세스를 설명하는 Pro Drupal Development 책에서 발췌 한 내용입니다.

부트 스트랩 프로세스

Drupal 부트 스트랩은 일련의 부트 스트랩 단계를 거쳐 모든 요청에 ​​따라 자체적으로 부트 스트랩됩니다. 이러한 단계는 bootstrap.inc에 정의되어 있으며 다음 섹션에 설명 된대로 진행됩니다.

구성 초기화

이 단계는 Drupal의 내부 구성 배열을 채우고 사이트의 기본 URL ($ base_url)을 설정합니다. settings.php 파일은 include_once ()를 통해 파싱되며, 거기에 설정된 모든 변수 또는 문자열 재정의가 적용됩니다. 자세한 내용은 sites / all / default / default.settings.php 파일의“Variable Overrides”및“String Overrides”섹션을 참조하십시오.

초기 페이지 캐시

높은 수준의 확장 성이 필요한 상황에서는 데이터베이스 연결을 시도하기 전에 캐싱 시스템을 호출해야 할 수도 있습니다. 초기 페이지 캐시 단계에서는 page_cache_ fastpath ()라는 함수가 포함 된 PHP 파일 (include () 포함)을 포함하여 브라우저로 컨텐츠를 인계하고 리턴합니다. 초기 페이지 캐시는 page_cache_fastpath 변수를 TRUE로 설정하여 사용 가능하며 포함 할 파일은 cache_inc 변수를 파일 경로로 설정하여 정의됩니다. 예를 들어 캐싱에 관한 장을 참조하십시오.

데이터베이스 초기화

데이터베이스 단계 중에 데이터베이스 유형이 결정되고 데이터베이스 쿼리에 사용될 초기 연결이 설정됩니다.

호스트 이름 / IP 기반 액세스 제어

Drupal은 호스트 이름 / IP 주소별로 호스트를 금지 할 수 있습니다. 액세스 제어 단계에서는 요청이 금지 된 호스트에서 오는지 확인하기 위해 빠른 검사가 수행됩니다. 그렇다면 액세스가 거부됩니다.

세션 처리 초기화

Drupal은 PHP의 내장 세션 처리 기능을 활용하지만 데이터베이스 기반 세션 처리를 구현하기 위해 자체 처리기로 일부 처리기를 재정의합니다. 세션은 세션 단계에서 초기화되거나 재설정됩니다. 현재 사용자를 나타내는 전역 $ user 객체도 여기에서 초기화되지만 효율성을 위해 모든 속성을 사용할 수있는 것은 아닙니다 (필요한 경우 user_load () 함수를 명시 적으로 호출하여 추가).

늦은 페이지 캐시

후기 페이지 캐시 단계에서 Drupal은 페이지 캐시에서 페이지를 제공할지 여부를 결정하기에 충분한 지원 코드를로드합니다. 여기에는 데이터베이스의 설정을 구성 초기화 단계에서 작성된 배열로 병합하고 모듈 코드를로드하거나 구문 분석하는 작업이 포함됩니다. 세션에서 익명 사용자가 요청을 발행했으며 페이지 캐싱이 사용 가능한 것으로 표시되면 페이지가 캐시에서 리턴되고 실행이 중지됩니다.

언어 결정

언어 결정 단계에서 Drupal의 다국어 지원이 초기화되고 사이트 및 사용자 설정에 따라 현재 페이지를 제공하기 위해 어떤 언어가 사용 될지 결정됩니다. Drupal은 경로 접두사 및 도메인 수준 언어 협상과 같은 언어 지원 결정을위한 여러 가지 대안을 지원합니다.

통로

경로 단계에서 경로 및 경로 별명을 처리하는 코드가로드됩니다. 이 단계에서는 사람이 읽을 수있는 URL을 확인하고 내부 Drupal 경로 캐싱 및 조회를 처리합니다.

완전한

이 단계에서는 공통 함수 라이브러리, 테마 지원 및 콜백 맵핑, 파일 처리, 유니 코드, PHP 이미지 툴킷, 양식 작성 및 처리, 메일 처리, 자동 정렬 가능 테이블 및 결과 세트 페이징 지원을로드하여 부트 스트랩 프로세스를 완료합니다. Drupal의 사용자 정의 오류 처리기가 설정되고 활성화 된 모든 모듈이로드됩니다. 마지막으로 Drupal은 init 훅을 발생시켜 요청의 공식 처리가 시작되기 전에 모듈에 통지 할 수있는 기회를 제공합니다.

Drupal이 부트 스트랩을 완료하면 프레임 워크의 모든 구성 요소를 사용할 수 있습니다. 이제 브라우저의 요청을 처리하고이를 처리 할 PHP 함수로 전달해야합니다. URL과 URL을 처리하는 기능 간의 매핑은 URL 매핑과 액세스 제어를 모두 처리하는 콜백 레지스트리를 사용하여 수행됩니다. 모듈은 메뉴 후크를 사용하여 콜백을 등록합니다 (자세한 내용은 4 장 참조).

Drupal이 브라우저 요청의 URL이 성공적으로 매핑되는 콜백이 있고 사용자에게 해당 콜백에 액세스 할 수있는 권한이 있다고 판단하면 콜백 함수로 제어가 전달됩니다.

요청 처리

콜백 함수는 요청을 수행하는 데 필요한 데이터를 처리하고 축적하는 데 필요한 모든 작업을 수행합니다. 예를 들어 http://example.com/ q = node / 3 와 같은 컨텐츠 요청 이 수신되면 URL은 node.module의 node_page_view () 함수에 맵핑됩니다. 추가 처리는 데이터베이스에서 해당 노드의 데이터를 검색하여 데이터 구조에 넣습니다. 그런 다음 테마를 만들 시간입니다.

데이터 테마

테마에는 검색, 조작 또는 생성 된 데이터를 HTML (또는 XML 또는 기타 출력 형식)로 변환하는 작업이 포함됩니다. Drupal은 웹 페이지에 올바른 모양과 느낌을주기 위해 관리자가 선택한 테마를 사용합니다. 결과 출력은 웹 브라우저 (또는 다른 HTTP 클라이언트)로 전송됩니다.


20

Eaton의 답변은 좋은 개요를 제공합니다. (나는 여기에 처음이므로 그를 수정할 수 없으므로 주석입니다.)

나를위한 잔인한 "아하"순간은 모든 것이 index.php와 모듈 폭포 (코어 우선, 사이트 별)를 통해 일어난다는 것을 깨달았습니다. 핵심 기능을 확장하기 위해 다시 작성하지 마십시오. 대신 모듈을 / sites / all / modules / 또는 / sites / [yoursite] / modules에 복사하고 THAT을 확장하거나 해당 위치에 새 모듈을 작성하십시오. 테마도 마찬가지입니다. 모듈 디렉토리에는 tpl, css 등의 표시 코드도 포함될 수 있습니다.

Rails, Django 등과 같은 MVC 유형 프레임 워크를 강화하는 데 익숙하다면이 모든 것이 약간 혼란스러워집니다. 모듈은 많은 디스플레이 코드를 혼합 할 수 있으며, 다른 사람의 모듈이나 템플릿을보고 있다면 결국 스택을 거꾸로 걷는다. 이것이 PHP에서 일하는 것의 아름다움 / 고통입니다.

아이러니하게도 "앱 제작"은 이것을 배우는 최악의 방법 일 수 있습니다. Drupal은 제어 흐름을 파악할 때까지 상자에서 너무 많은 작업을 수행하여 불분명합니다. tpl 파일에는 l ()과 같은 재미있는 이름을 가진 함수의 출처를 알려주는 내용이 없습니다.


7

그것은 당신이 찾고있는 이해의 깊이에 달려 있습니다. PHP에 대해 잘 알고 있다면 index.php로 시작하여 include / bootstrap.inc로 이동 한 다음 해당 디렉토리의 다른 스크립트 중 일부를 살펴 보는 것이 좋습니다.

키에는 파일이 포함됩니다.

  • menu.inc는 URL을 내용에 대한 암시 적 매핑을 처리하므로 전체 시스템의 작동 방식을 이해하는 데 매우 중요합니다.
  • common.inc는 API의 기초를 형성하는 다른 신비한 기능을 대부분 가지고 있습니다.
  • module.inc는 Eaton이 언급 한 후크 호출을 처리합니다.
  • form.inc는 양식 표시, 제출 및 처리를 다룹니다
  • theme.inc는 프리젠 테이션을 처리합니다.

modules / 디렉토리에는 몇 가지 주요 기능이 있습니다. 특히 modules / node / node.module은 일반적으로 사이트 컨텐츠를 캡슐화하는 데 사용되는 노드 시스템의 기초를 형성합니다.

코드는 일반적으로 매우 주석 처리되고 명확합니다. 주석에서 Doxygen 마크 업을 사용한다는 것은 코드가 사실상 표준 문서라는 것을 의미합니다.

또한 함수 정의로 빠르게 이동할 수있는 편집기를 사용하여이를 수행하는 데 도움이됩니다. ctags와 함께 vim을 사용하면 효과가 있습니다. ctags에게 .inc, .module 등의 파일을 PHP 파일로 색인하도록 지시해야합니다.


5

drupal .php 코드를 NetBeans 프로젝트로 가져 와서로드를 배웠습니다. 그런 다음 netbeans 디버거를 실행하고 페이지의 여러 단계가 함께 나타나는 것을 볼 수 있습니다.


5

이 주제에 관한 최고의 책은 "Pro Drupal Development"및 "Using Drupal"입니다.

"Pro Drupal Development"에는 Drupal의 각 API (양식, 테마 등)에 대한 몇 가지 멋진 순서도와 요약이 포함되어 있습니다. 그것은 사람들이 자신의 모듈과 테마를 만드는 데 특히 유익하도록 의도되었지만 Drupal을 이해하려는 일반적인 PHP에 정통한 개발자에게는 많은 가치가 있습니다. 게다가, 내가 만든 모든 사이트에 대해 사용자 정의 모듈을 만들었습니다. 여러 양식에서 필드를 선택적으로 숨기고 (일반적으로 엔드 노드 양식을 단순화하기 위해 수행하려는) 이 정보를 모자 아래에 두는 것이 좋습니다.

"Drupal 사용"은 갤러리, 블로그 및 소셜 네트워킹 사이트와 같은 유용한 자료를 작성하는 방법을 알고 싶은 사이트 개발자를 대상으로합니다. 몇 가지 사용 사례를 살펴보고 각 작업을 수행하도록 기존 모듈을 구성하는 방법을 보여줍니다. 이 과정에서 필수 애드온 모듈 인 "CCK (Content Construction Kit)"및 "보기", 사용자 정의 블록 및 템플릿을 만드는 방법 및 Drupal 사이트 유지 관리에 대한 정보를 익 힙니다. 저는이 책을 특히 속도를 높이고 Drupal을 즉시 사용하려는 사람들에게 권장합니다. 이 과정에서 Drupal의 내부 조직에 대한 이해를 얻습니다.


5

& (드루팔 6) (드루팔 7) 드루팔의 꽤 좋은 건축 개요입니다. 더 자세한 내용을 원하면 대부분 의 문서를 작성하는 것이 좋습니다. 구체적인 것을 달성하지 않고 높은 수준의 세부 사항으로 배우려고 시도하는 것은 무언가를 시도하는 것보다 훨씬 더 어려울 것입니다.


4

대화에 2 년 늦어진 새로운 기고자 ;-)

https://stackoverflow.com/a/1070325/1154755에 회신

핵심 기능을 확장하기 위해 다시 작성하지 마십시오. 대신 모듈을 / sites / all / modules / 또는 / sites / [yoursite] / modules에 복사하고 THAT을 확장하거나 해당 위치에 새 모듈을 작성하십시오. 테마도 마찬가지입니다.

실제로, 핵심 모듈을 복사하기 위해 복사 할 필요가 없었습니다. Drupal Hooks 만 있으면됩니다.

테마의 경우, 때로는 갈 수있는 유일한 방법이지만 종종 필요한 결과를 얻기 위해 하위 테마를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.