답변:
다른 답변은 훌륭하고 정확하며 상세하지만, 그들이 대답 한 사람이 찾고 있던 개념의 핵심을 설명하는 "단순한 단어"인지 확실하지 않습니다.
나는 후크가 코드가 멈추고 " 누군가 여기에 추가 할 것이 있습니까? "라고 소리 치는 지점이라고 생각 합니다. 모든 모듈은 이에 응답하는 함수를 가질 수 있으며 코드의 해당 시점에 적절한 데이터가 전달되면 트리거됩니다.
간단한 예제는 hook_node_delete () 입니다. 모든 모듈은이 모듈을 사용하여 노드가 삭제 될 때마다 작업을 수행 할 수 있습니다. 문서는이 후크가 작업 할 삭제할 노드의 객체를 모듈에 전달하고 호출 시점의 정확한 타이밍과 같은 다른 유용한 정보를 설명합니다 (예 : 노드 데이터가 실제로 데이터베이스에서 삭제되기 전) Drupal의 코드에서 후크가 호출되는 위치는 두 곳 이상일 수 있습니다.
Drupal api 에서 "hook_"로 시작하는 것을 탐색하여 후크가 존재하는지 탐색하고 전달 된 데이터를 찾을 수 있습니다 .
후크는 이름 규칙에 따라 작동합니다. hook_node_delete
예를 들어, 노드 삭제 프로세스가 후크가 호출되는 지점에 도달 할 때 [modulename]_node_delete()
후크 이름의 단어 후크가 모듈 이름으로 대체되는 이와 같은 기능을 가진 모든 모듈에 대해 my_amazing_module_node_delete()
), 해당 함수가 호출됩니다.
왜? 예를 들어, 삭제 된 노드를보고 특정 조건 (예 : 관리자에게 이메일을 보내거나 긴 프로세스를 시작)을 충족하는 경우 모든 모듈이 이러한 주요 지점에서 무엇이든 할 수 있습니다.
일부 후크를 사용하면 처리 직전에 생성 된 항목을 변경할 수 있습니다. 예를 들어, hook_menu_alter () 는 시스템이 생성 한 현재 메뉴 항목을 전달합니다. 모든 모듈은 some_modulename_menu_alter () 함수를 정의하고,보고, 선택적으로 변경하고 (일부 삭제, 추가, 정렬 ...) 새로 변경된 메뉴를 다시 전달할 수 있습니다.
간단하고 강력하며 Drupal이 모듈 식 시스템으로 작동하는 방식의 핵심입니다. 후크 구현은 대부분의 Drupal 모듈의 핵심입니다.
Drupal 커뮤니티는 Drupal 커뮤니티가 후크의 각 구현에 다음과 같이 앞에 주석을 추가하십시오 ( "Implements hook _..."비트 참고).
/**
* Implements hook_some_hook().
*
* Some descriptive summary of what this does
*/
function my_amazing_module_some_hook() {
API 역할을하는 일부 모듈은 자체 후크를 정의합니다. 예를 들어, 보기 는 보기 를 작성하거나 표시하는 과정에서 다양한 지점에서 데이터를 추가하고 읽고 편집 할 수있는 많은 후크를 정의합니다. 사용자 정의 모듈에서 작성된 후크에 대한 정보는 두 곳에서 찾을 수 있습니다 (모듈이 규칙 등을 따르는 것으로 가정).
modulename.api.php
모듈 폴더 에있는 파일 의 코드 및 주석부트 스트랩은 다른 사람들이 설명했듯이 기본적으로 부팅됩니다. 다른 명확한 설명은 복제하지 않습니다.
가장 일반적인 후크 구현 중 하나는 hook_menu 이며, 이는 모듈이 Drupal 시스템 내에서 새 경로를 등록 할 수있게합니다.
function my_module_menu() {
return array('myawesomefrontpage' => array(
'page callback' => 'function_that_will_render_frontpage'
));
}
Drupal에서 매우 빈번한 패턴에는 [DATATYPE]_info
후크와 [DATATYPE]_info_alter
후크가 있습니다. 새 필드 유형을 작성하려면 관련 field_info -hook을 구현하고 기존 유형을 조작하려면 해당 field_info_alter -hook을 구현하십시오 .
편집 : Chx의 의견에서 지적했듯이 관찰자 패턴은 객체 지향적이며 Drupal 7은 여전히 그렇지 않습니다. 그러나 객체 지향 관점 (2005 년 4 월 4 일 JonBob에 의해 작성 됨) 에서 Drupal 프로그래밍 위키 페이지가 있는데, 이것에도 불구하고 Drupal이 객체 지향 코드 패턴을 사용하는 방법을 설명합니다. 방문자가 아닌 관찰자를 언급한다는 점이 흥미 롭습니다.
Drupal 8에 대한 참고 사항 이것은 아직 초기 단계이며 변경 될 수 있지만 Drupal에 기능을 추가하는 데있어 사실상 후크가 사실상 표준 이었음에도 불구하고 플러그인 의 개념 이 훨씬 더 눈에 띄게됩니다. Drupal 8에서 Core와 상호 작용하는 새로운 방법을 제공 할 것입니다. 관련 문제 및 설명서 .
평신도의 용어로, 후크는 모듈이 서로 상호 작용하고, 서로의 구조와 데이터를 변경하고, 새로운 데이터를 제공하는 방법을 제공하는 일종의 브리지입니다.
대부분의 경우 hook_
함수 이름 의 단어 는 모듈 이름으로 바뀌며 모듈이 다른 모듈의 작동을 활용할 수있는 방법을 제공합니다. 예를 들어 "node"라는 drupal 코어 모듈은 다양한 후크를 호출합니다. 그중 하나 hook_node_update
는 기존 노드가 업데이트 될 때마다 호출됩니다. 이 후크가 호출되면 모듈 (우리가 호출한다고 함 mymodule
)의 구현 hook_node_update
이 호출됩니다.이 경우 모듈의 .module 파일에 mymodule_node_update
함수가됩니다 (이 함수는 모듈 폴더의 모든 파일에있을 수 있습니다) .module 파일에도 포함되어 있습니다). 이 후크에는 후크를 호출 한 함수로 사용, 수정 및 / 또는 되돌릴 수있는 필수 매개 변수 (변수)가 전달됩니다.
내가 Drupal을 처음 배우기 시작했을 때, 나는 지금 당신과 같은 보트에 있었고, 처음에는 이해하기가 약간 까다 롭지 만 일단 그것을 얻으면 너무 간단하고 직관적입니다. 행운을 빕니다.
핵심 개발자 중 한 명이 얼마 전 "객체 지향적 관점에서의 반복 프로그래밍" 이라는 기사를 작성했습니다 . 후크가 많은 일반적인 디자인 패턴 을 구현하는 것으로 생각할 수있는 방법을 잘 설명 해줍니다. 후크에 대한 가장 좋은 설명은 기사에서 나옵니다.
Drupal의 후크 시스템은 인터페이스 추상화의 기초입니다. 후크는 모듈에서 수행하거나 모듈에서 수행 할 수있는 작업을 정의합니다. 모듈이 후크를 구현하는 경우, 후크가 호출 될 때 특정 태스크를 수행하거나 특정 유형의 정보를 리턴하기 위해 계약을 체결합니다. 호출 코드는 후크를 호출하여 유용한 작업을 수행하기 위해 모듈 또는 후크가 구현되는 방식에 대해 알 필요가 없습니다.
부트 스트랩은 Drupal이 기본적으로 모든 핵심, 테마 및 모듈 코드를 순서대로 실행하여 페이지를 작성하는 과정입니다.
기본적으로 Drupal이 부팅되는 방식이며 CMS 역할을 수행 할 준비를합니다.
모듈과 테마의 어느 곳에 나 후크를 놓을 수 있다는 점에서 영리합니다. 부트 스트랩 프로세스는 올바른 지점에서 실행되도록합니다.
예를 들어 'hook_form_alter'를 사용하여 사용자 정의 확인란을 양식에 추가하면 Drupal의 부트 스트랩은 양식을 렌더링하기 직전에 해당 코드를 실행합니다.
부트 스트랩의 한 가지 문제는 적은 양의 데이터 만 반환하더라도 전체 프로세스를 실행하는 데 시간이 걸린다는 것입니다. 서비스 모듈과 함께 Drupal을 API로 사용하고 많은 작은 XHTML 또는 JSON 응답을 반환 할 때 전체 부트 스트랩을 통한 실행은 그리 성능이 좋지 않습니다. 일부 영리한 사람들은 Drupal 8을 위해이 문제를 해결하는 영리한 방법을 찾고 있습니다.
그러나 일반적인 Drupal 페이지를 렌더링하기 위해 부트 스트랩 프로세스는 훌륭하게 작동하며 Drupals 캐싱 시스템을 사용하여 작업 속도를 높이고 사이트의 모든 부분을 완벽하게 제어 할 수 있습니다. 사이트 속도가 느리면 APC 또는 MemCached와 같은 것을 사용하여 속도를 높일 수 있습니다.
나는 내 대답이 정확하고 당신을 위해 간단하게 설명하기를 바랍니다. 나는 전문가가 아니지만 그것이 그것이 작동하는 방식이라고 생각합니다.
부트 스트랩 은 Drupal이 자체적으로 초기화하는 프로세스입니다. 이 과정에는 실제로 다음이 포함됩니다.
$_SERVER
init_set()
내가 설명한 작업 중 일부는 Drupal 7 이상에만 해당되지만 대부분의 작업은 Drupal 버전과 독립적입니다.
후크는 작업을 수행해야 할 때 Drupal 또는 타사 모듈에서 호출 할 수있는 PHP 함수입니다. 호출 할 함수의 접두사 목록을 갖지 않고, 활성화 된 모듈과 이들이 구현하는 기능을 검사하는 빌드입니다.
예를 들어 Drupal은 hook_node_update()
; node_save () 로 노드를 저장 하면 다음 코드가 실행됩니다.
// Call the node specific callback (if any). This can be
// node_invoke($node, 'insert') or
// node_invoke($node, 'update').
node_invoke($node, $op);
무엇 node_invoke () 하는 일은 다음과 같다 :
$node
매개 변수로 전달 하여 해당 함수 호출후크는 데이터베이스에 자체 데이터를 저장하거나 함수에서 반환 된 값을 변경할 수 있습니다. 마지막 경우에 발생하는, 예를 들면, hook_form_alter () 의 값을 변경하는, $form
참조로 전달 drupal_prepare_form을 () .
Drupal 훅은 일반적으로 다음 세 가지 기능을 사용하여 호출됩니다.
drupal_alter()
hook_form_alter () , hook_hook_info_alter () 및 hook_tokens_alter () 와 같이 참조로 전달 된 데이터를 변경하는 것이 목적인 특정 후크를 호출하는 데 사용되는 함수 입니다.
와 같은 후크를 호출하는 데 사용되는 다른 함수가 node_invoke()
있지만 이러한 함수는 본질적으로 이전에 나열된 함수 중 하나를 사용합니다.
후크는 포인트 컷 이며 module_invoke_all
위버입니다 (구현에서 명확하지 않으며 다른 직조 기능이 있습니다). 내가 아는 한 Drupal은 PHP 기능으로 AOP 를 구현하는 유일한 시스템 입니다.
Drupal에서 AOP의 작동 방식에 대한 다른 설명을 참조하십시오 .
Drupal이 호출 할 수있는 후크를 보려면 api.drupal.org 로 이동 하여 검색 창으로 이동 한 후 'hook_'을 입력하십시오. 이것은 Drupal이 정의한 대부분의 후크 목록을 제공합니다. '_alter'에 대해 동일한 작업을 수행하고 더 많이보십시오.
노드 API 후크 페이지는 노드 작업 중에 호출 모든 후크의 연대기 목록을 제공합니다. 후크를 호출 할 때 노드 모듈과 엔터티 및 필드 시스템이 서로 교대하는 것을 볼 수 있습니다.
예를 들어, 아래로 스크롤하여 다음 섹션을 보면 node_load()
: 노드 모듈이 hook_load ()를 제공 한 다음 일부 필드를로드하는 엔티티 시스템에 제어를 전달합니다. 전체 필드 훅 호스트가 나열되지 않은 경우, 엔터티 시스템이 호출 할 때 hook_entity_load()
제어를 호출하는 노드로 다시 전달하기 전에 엔티티 시스템이 호출 할 때 hook_node_load()
.
이를 통해 코드는 문제가있는 노드가로드 될 때마다 작동 할 수있는 기회를 제공합니다. 이러한 후크를 배우고 언제, 왜 호출되는지는 Drupal 코딩 모험의 일부입니다. :-)
다른 시스템에도 고리가 있습니다. 같은 hook_init()
과 hook_boot()
. 이것은 질문의 부트 스트랩 부분에 도달합니다. hook_boot()
캐싱 시스템이로드되기 전에 Drupal에 의해 호출됩니다. 따라서 Drupal이 실제로 시작하기 전에 모듈이 무언가를해야하고 캐싱에 관계없이 코드를 실행하려면 구현해야합니다.hook_boot()
. 그렇지 않으면 캐시되지 않은 페이지 만 신경 쓰면을 구현 hook_init()
합니다.
이렇게하면 Drupal이 완전히 부팅되기 전에 로딩 프로세스 초기에 무언가를 구현할 수있는 옵션을 제공하면서 프로세스의 어느 지점에서 가로 채기를 원하는지에 대한 유연성을 제공합니다.
진행하기 전에 Drupal이 특정 지점으로 부팅되었는지 확인해야하는 경우 전화로 문의하십시오 drupal_bootstrap()
. 해당 문서를 클릭하면 아무것도에서 모든 것까지 사용 가능한 부트 스트랩 레벨을 볼 수 있습니다.
마지막으로, 예제 프로젝트 에서 특정 서브 시스템에 대해 광범위하게 문서화 된 코드를 볼 수 있습니다 .
후크는 php 함수이며 "yourmodulename_hookname"이라는 명명 규칙을 기반으로하는 빌딩 블록으로 개발자가 모듈 을 쉽게 만들 수 있도록 고안되었습니다 .
모듈은 Drupal 시스템에서 CORE 및 사용자 정의 기능을 모두 사용할 수 있기 때문에 실제 거래입니다. 따라서 모듈은 후크로 구성 되며 Drupal 설치에서 모듈이 활성화되면 module.inc 함수 module_invoke_all ($ hook) 또는 module_invoke 덕분에 다른 모듈에서 후크 기능을 호출 할 수 있습니다 .
따라서 후크가 무엇인지 제대로 이해하려면 실제로 손을 더럽 히고 모듈 개발을 시도해야합니다. 이를 위해 Drupal의 개발자를위한 몇 가지 예제를 다운로드하여 시도해보십시오 . 모듈 작성 에 대해서도 잘 알고 있어야 합니다.
위에서 언급 한 개발자에게 유용한 Drupal의 예는 다음과 같습니다.
block_example 모듈의 hook_block_view () 구현 예제
/**
* @file examples/block_example/block_example.module line 127
*
* Implements hook_block_view().
*
* This hook generates the contents of the blocks themselves.
*/
function block_example_block_view($delta = '') {
//The $delta parameter tells us which block is being requested.
switch ($delta) {
case 'example_configurable_text':
// The subject is displayed at the top of the block. Note that it
// should be passed through t() for translation. The title configured
// for the block using Drupal UI supercedes this one.
$block['subject'] = t('Title of first block (example_configurable_text)');
이 후크를 통해 Drupal의 블록 생성에 액세스하여 웹 사이트에 사용자 정의 블록을 표시 할 수 있습니다. block.module에는 모든 모듈이 hook_block 뷰를 정의 할 수있게 하는 _block_render_block 함수 가 있기 때문에 가능합니다 (module_invoke 마지막 행에 주목).
/**
* @file modules/block/block.module, line 838
*
* Render the content and subject for a set of blocks.
*
* @param $region_blocks
* An array of block objects such as returned for one region by _block_load_blocks().
*
* @return
* An array of visible blocks as expected by drupal_render().
*/
function _block_render_blocks($region_blocks) {
...
foreach ($region_blocks as $key => $block) {
...
$array = module_invoke($block->module, 'block_view', $block->delta);
render_example 모듈의 hook_menu () 구현 예제
/**
* @file examples/render_example/render_example.module line 22
*
* Implements hook_menu().
*/
function render_example_menu() {
...
$items['examples/render_example/arrays'] = array(
'title' => 'Render array examples',
'page callback' => 'render_example_arrays',
'access callback' => TRUE,
);
이 후크는 Drupal의 URL 라우팅 시스템에 연결되며 모듈에서 사용되는 관련 렌더링 콜백으로 URL 패턴을 정의합니다. system.module에서 호출됩니다 .
부트 스트랩에 대해 기본적으로 각 페이지 요청에서 실행되는 것을 알아야합니다. 나는 이 stackoverflow answer 을 읽고 , 부트 스트랩과 후크가 어떻게 관련되어 있지만 분리되어 있는지 설명합니다.
웹 페이지 표시와 관련하여 Drupal의 웹 사이트 html 표시는 주로 렌더 배열 및 테마로 이루어집니다 .
모듈이 module_implements ()를 호출하는 모든 곳 http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupal은 무게를 기준으로 올바른 이름의 모든 기능을 올바른 순서로 실행합니다. module_implements를 사용하는 모듈에 대한 설명서에서 hook_menu와 같은 것을 볼 수 있기 때문에이를 후크 함수라고합니다 (메뉴가 메뉴 항목을 반환하도록 설계된 모든 함수를 호출 할 때). "hook"이라는 단어는 그것을 구현하는 모듈의 이름으로 바꾸면되고 Drupal은 나머지를 수행합니다.
drupal_alter () 함수도 있습니다. 다른 후크에 의해 이전에 등록 된 것을 변경할 수 있도록하기 위해 올바르게 이름이 지정된 모든 alter 함수를 시작합니다.
일반적으로 alters는 인수를 참조로 전달하므로 객체를 직접 편집 할 수 있지만 "normal"후크는 일반적으로 새로운 것을 반환합니다.
아이디어는 Drupal에 필요한 모든 후크 함수를 호출하고 반환 된 내용을 다시 처리하도록 요청하여 모듈 (자신의 모듈 포함)을 쉽게 확장 할 수 있다는 것입니다. 후크 함수를 호출하는 모듈은 후크를 구현하는 모듈에 대해 아무것도 알 필요가 없으며 후크를 구현하는 모듈은 실제로 후크를 호출하는 모듈에 대해 아무것도 알 필요가 없습니다. 두 모듈 모두 알아야 할 것은 반환되거나 변경되는 데이터의 구조입니다.
실제로 후크는 가장 일반적으로 다음과 같은 용도로 사용됩니다.
나에게 그것은 후크와 코어 (D7)에 관한 module_implements 함수에 관한 것입니다. 내가 이해하는 것이 중요하다고 생각하는 것은 무언가를 수정하기위한 후크를 작성함으로써, 처리하는 데이터 구조에 어떤 일이 발생했는지에 대해 마지막으로 말하지 않는다는 것입니다. 훅은 단순히 메뉴, menu_links, 블록, 노드, 사용자 또는 엔티티 또는 렌더 요소와 같은 동일한 데이터 구조에 작용하는 함수의 라인 (큐)에 도달합니다.
따라서 후크가 예상 된 방식으로 실제로 사용되도록하려면 후크 (줄)가 어디에 있는지 알고 있어야합니다. 이것은 당신의 mondule의 무게에 의해 결정됩니다. Drupal 코어는 오름차순으로 올바른 이름의 후크를 호출하며 데이터에 발생하는 모든 작업을 수행합니다.
나는 그 효과가 없었기 전에 후크를 작성했습니다. 몇 시간 동안 머리를 두드리고 나면 모듈 무게가 너무 가벼워서 후속 후크가 내가 한 일을 효과적으로 취소하거나 완전히 함께 무시한다는 것을 알게되었습니다.
잘 작성된 후크는 "맨-핸들링"또는 "강제력"자체가 마지막이 아니라 "후크의 나머지 후크에 의해 예상되는대로 데이터 구조를 유지함으로써"다른 사람들과 잘 어울립니다 ".
그리고 후크의 "라인"에 대해 말하십시오. 몇 년 동안 Drupal에 대해 Google을 트롤링 한 결과,이 이미지는 전처리 및 프로세스 훅 가능성 목록을 잘 보여주는 것으로 보입니다.
훨씬 간단한 방법으로 후크는 개발자가 기존 코드를 변경하지 않고도 요구 사항에 따라 기존 기능을 변경할 수 있도록 도와줍니다. PHP의 추상 함수와 비슷합니다.
예 : 버스 티켓을 예약하기위한 모듈을 만들었습니다. 티켓이 한 번 예약 된 경우 코드에 따르면 해당 프로젝트의 요구 사항 인 픽업 위치를 편집 할 수 없습니다. 친구에게 사용자가 픽업 위치를 변경할 수 있다는 점을 제외하고 유사한 요구 사항에 대해 동일한 모듈이 필요하다고 가정하십시오. 어쨌든 그는 모듈을 사용해야하며 코드 변경을 원하지 않습니다. 따라서 모듈을 변경하지 않고 변경 사항을 구현할 수있는 인터페이스 (우리의 경우 후크)를 제공하십시오.
drupal-7까지 drupal에서 우리는 모듈뿐만 아니라 테마를위한 고리를 가지고 있습니다. 후크 작동 방식 확인 방법은 drupal.org 후크 를 통해 사용자 정의 후크 생성 링크를 확인 하십시오.
갈고리. 모듈이 Drupal 코어와 상호 작용할 수 있도록합니다. Drupal의 모듈 시스템은 "후크"개념을 기반으로합니다. 후크는 이름이 foo_bar () 인 PHP 함수입니다. 여기서 "foo"는 모듈의 이름 (이러한 파일 이름은 foo.module)이고 "bar"는 후크의 이름입니다.