私はPHPの中間です。スキルを磨くために、Drupalの学習を開始します。7. Drupalアーキテクチャの概念を学びながら、用語hooksおよびbootstrappingに戸惑いました。たくさん。私は "Pro Drupal development"の本とdrupal.orgのいくつかのドキュメントを読みましたが、フックがDrupalでどのように機能してWebページを表示するかを知るには、とても進んでいます。
簡単な言葉でフックとは何か教えてもらえますか?
他の答えは素晴らしく、正確、詳細ですが、質問者が探していた概念の骨子を説明する「単純な言葉」であるかどうかはわかりません。
フックは、コードが一時停止し、「他に誰かがここに追加するものを持っている?」と叫ぶポイントと考えています。どのモジュールもこれに応答する関数を持つことができ、適切なデータがコードのその時点で渡されてトリガーされます。
わかりやすい簡単な例は、 hook_node_delete() です。どのモジュールでもこれを使用して、ノードが削除されるたびに処理を実行できます。ドキュメントは、このフックがその削除されたノードのオブジェクトをモジュールに渡し、それが呼び出される正確なタイミング(ノードデータが実際にデータベースから削除される前など)のような他の有用な情報の概要を説明しています。 、そしてDrupalのコードのどこでフックが呼び出されるか(これは複数の場所にすることができます)。
the Drupal api の "hook_"で始まるものを探索することにより、存在するフックを探索し、それらに渡されるデータを見つけることができます。
フックは名前の規則に従って機能します。例として_hook_node_delete
_を使用すると、ノードの削除プロセスがフックが呼び出されるポイントに到達すると、このような関数を持つすべてのモジュールで[modulename]_node_delete()
がWordフックに使用されますフックの名前がモジュールの名前(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として機能するいくつかのモジュールは、独自のフックを定義します。たとえば、 Views は、ビューの作成または表示のプロセスのさまざまな時点でデータを追加、読み取り、編集できる多くのフックを定義します。カスタムモジュールで作成されたフックに関する情報は、2つの場所から見つけることができます(モジュールが規則に従っている場合など)。
modulename.api.php
_ファイルのコードとコメントブートストラップは、他の人が説明したように、基本的に起動します-他の明確な説明を重複することはしません。
フックは、主に Visitor および Observer パターンの実装です。
最も一般的なフック実装の1つは hook_men です。これにより、モジュールは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 -を実装します針。
編集:コメントでChxが指摘しているように、オブザーバーパターンはobject指向であり、Drupal 7はまだほとんどの場合そうではありません。ただし、ウィキページ オブジェクト指向の観点からのDrupalプログラミング (2005年4月4日にJonBobが作成)があり、Drupalがオブジェクト指向コードパターンをどのように使用するかを説明しています。オブザーバーについて言及しているが、ビジターについては言及していないことに注意してください。
Drupalに関する注意事項8これはまだ初期段階であり、変更される可能性がありますが、フックを追加して機能を追加する際の事実上の標準であるフックを追加したいと思います。 Drupal、 plugins の概念は、Drupal 8でより明確になり、Coreと対話する新しい方法を提供します。関連 issue 、および documentation 。
素人の言葉で言えば、フックは一種のブリッジであり、モジュールが互いに相互作用し、互いの構造とデータを変更し、新しいデータを提供する方法などを提供します。
ほとんどの場合、関数名のWord hook_
はモジュールの名前に置き換えられ、モジュールが別のモジュールの操作を利用できるようにします。たとえば、drupal "node"と呼ばれるコアモジュールは、さまざまなフックを呼び出します。その1つは、既存のノードが更新されるたびに呼び出されるhook_node_update
です。このフックが呼び出されると、モジュールの(ここではmymodule
と呼びます)hook_node_update
の実装が呼び出されます。この場合、mymodule_node_update
というモジュールの.moduleファイル内の関数になります(この関数は、 .moduleファイルにも含まれている限り、モジュールのフォルダー内のファイルです。このフックには、必要なパラメーター(変数)も渡されます。これらのパラメーターを使用して、変更したり、フックを呼び出した関数に戻したりできます。
私が初めてDrupalを学び始めたとき、私はあなたと同じ船に乗っていました。最初は把握するのが少し難しいですが、一度理解すれば、とても簡単で直感的です。幸運を。
コア開発者の1人が、先ほど "オブジェクト指向の観点からのDrupalプログラミング" と呼ばれる記事を書きました。これは、フックが一般的な 設計パターン の多くを実装していると見なすことができる方法を説明するのに役立ちます。フックの最も良い説明は記事から来ています:
Drupalのフックシステムは、そのインターフェース抽象化の基礎です。フックは、モジュール上で、またはモジュールによって実行できる操作を定義します。モジュールがフックを実装する場合、そのモジュールはコントラクトに入り、特定のタスクを実行するか、フックが呼び出されたときに特定のタイプの情報を返します。呼び出しコードは、フックを呼び出すことによって有用な作業を行うために、モジュールやフックの実装方法について何も知る必要はありません。
BootstrapはプロセスですDrupalはページを構築するために実行され、基本的にすべてのコア、テーマ、およびモジュールのコードを順番に実行します。
基本的にはDrupalが起動し、CMSとしての仕事をする準備をしています。
モジュールとテーマのどこにでもフックを置くことができ、bootstrapプロセスは、それらが正しいポイントで実行されることを確実にします。
たとえば、「hook_form_alter」を使用してカスタムチェックボックスをフォームに追加する場合、Drupalのbootstrapは、フォームをレンダリングする直前にそのコードを実行することを確認します。
bootstrapの1つの問題は、少量のデータしか返さない場合でも、プロセス全体の実行に時間がかかることです。Drupalをbootstrap全体を実行すると、APIとしてのサービスモジュールと多くの小さなXHTMLまたはJSON応答を返します。あまりパフォーマンスが良くありません。Drupal 8。
しかし、通常のレンダリングDrupalページの場合、bootstrapプロセスは適切に機能し、Drupalsキャッシュシステムを使用して高速化し、すべての部分を完全に制御できます。あなたのサイトが遅いと感じた場合、いつでもAPCやMemCachedのようなものを使用してスピードアップを図ることができます。
私の答えが正確で、あなたのために単純に説明しているといいのですが、私は専門家ではありませんが、それがそのように機能していると思います。
Bootstrapは、中のプロセスですDrupalはそれ自体を初期化します。プロセスには実際に次のものが含まれます。
$_SERVER
_に含まれるいくつかの仕様グローバル変数の値の初期化init_set()
を使用していくつかの変数を初期化する私が説明した操作の一部はDrupal 7以上に固有ですが、ほとんどの操作はDrupalバージョンから独立しています。
フックはPHP関数であり、タスクを実行するために必要な場合、Drupalまたはサードパーティのモジュールから呼び出すことができます。関数のプレフィックス付きリストを呼び出す代わりに、リストが作成されます有効なモジュールと、それらが実装する機能を確認します。
例: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
_を渡しますフックは独自のデータをデータベースに保存したり、関数から返された値を変更したりできます。最後のケースは、たとえば、 dookal_prepare_form() への参照として渡される_$form
_の値を変更する hook_form_alter() で何が起こるかです。
Drupalフックは通常、3つの関数を使用して呼び出されます。
drupal_alter()
は、参照として渡されたデータを変更することを目的とした特定のフックを呼び出すために使用される関数です(例: hook_form_alter() 、 hook_hook_info_alter() 、および hook_tokens_alter() です。
node_invoke()
など、フックの呼び出しに使用される関数は他にもありますが、それらの関数は基本的に、前にリストした関数の1つを使用します。
フックは pointcuts であり、 module_invoke_all
はウィーバーです(alasは実装で明確ではなく、他のウィービングがあります)機能)。私が知る限り、Drupalは、PHP関数で [〜#〜] aop [〜#〜] を実装する唯一のシステムです。
フックを表示したい場合Drupalで呼び出すことができます api.drupal.org に移動し、検索ボックスにタブで移動して、「hook_」と入力します。これはDrupalで定義されているほとんどのフックの大きなリストが表示されます。'_alter 'に対して同じことを実行すると、さらに多くのことがわかります。
ノードAPIフック ページは、ノード操作中に呼び出されたすべてのフックの時系列リストを提供します。 NodeモジュールとEntityおよびFieldシステムがフックの呼び出しでお互いに方向転換しているのを見ることができます。
たとえば、下にスクロールしてnode_load()
のセクションを見る場合:Nodeモジュールは、hook_load()を提供し、ロードするエンティティシステムに制御を渡します。一部のフィールド。リストされていないフィールドフックのホスト全体があり、それがエンティティシステム上にある場合、hook_entity_load()
を呼び出してから、Nodeに制御を渡すことにより、hook_node_load()
。
これにより、コードが読み込まれるときに、問題のノードを1つずつ処理する機会がコードに与えられます。これらのフックを学び、いつ、なぜ呼び出されるかは、Drupalコーディングの冒険の一部です。:-)
他のシステムにもフックがあります。 hook_init()
および hook_boot()
など。これは、質問のbootstrapの部分に到達します。hook_boot()
は、Drupalによって呼び出され、キャッシュシステムがロードされる前に実行されます。 Drupalが実際に起動してから、キャッシュに関係なくコードを実行したい場合は、hook_boot()
を実装します。それ以外の場合は、ページのみに関心がある場合キャッシュされない場合は、hook_init()
を実装します。
これにより、Drupalが完全に起動する前に、ロードプロセスの早い段階で何かを実装するオプションが提供されますが、プロセスのどのポイントでインターセプトするかについてある程度の柔軟性が得られます。
続行する前にDrupalが特定のポイントで起動したことを確認する必要がある場合は、 drupal_bootstrap()
を呼び出すことができます。 bootstrap利用可能なレベルを、何もないものからすべてのものまで、見ることができます。
そして最後に、 Examplesプロジェクト で、特定のサブシステムについて広範囲に文書化されたコードを確認できます。
フックはphp関数であり、命名規則「yourmodulename_hookname」に基づいてブロックを構築します。フックは、開発者がモジュールを作成するのを容易にするためのものです。
Drupalシステムでコアとカスタムの両方の機能を有効にするため、モジュールは本当の取引です。したがって、モジュールはフックモジュールがDrupalインストールでアクティブ化されると、そのフック関数はmodule.inc関数のおかげで他のモジュールから呼び出すことができます module_invoke_all($ hook) またはmodule_invoke。
したがって、フックとは何かを正しく理解するには、実際に手を汚して、モジュール開発を試す必要があります。この目的のために、まず Drupal's Examples for Developers をダウンロードして試してみてください。 modules creation にも慣れる必要があります。
上記の開発者にとって有用なDrupalの例を以下に示します。
hook_block_view()block_exampleモジュールの実装例
/**
* @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のブロック作成にアクセスして、Webサイトにカスタムブロックを表示できます。これは、block.moduleに _ block_render_block function があり、すべてのモジュールがそれらのhook_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);
hook_menu()render_exampleモジュールの実装例
/**
* @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から が呼び出されます。
ブートストラップについては、基本的には、ページリクエストごとに実行されることを知っていれば十分です。 このスタックオーバーフローの回答 を読むことをお勧めします。bootstrapとフックが関連しているが、分離されている方法を説明しています。
Webページの表示に関して、DrupalのWebサイトのhtml表示は、主に render array とテーマで実現されます。
モジュールがmodule_implements()を呼び出す場所 http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupalはすべての正しく名前が付けられた関数を、その重みに基づいた正しい順序で。これらはフック関数と呼ばれます。これは、module_implementsを使用するモジュールのドキュメントで、(メニューがメニュー項目を返すように設計されたすべての関数をメニューが呼び出す場合に)hook_menuのようなものが表示されるためです。 「フック」という単語は、それを実装するモジュールの名前に置き換えるだけで、あとはDrupalが行います。
以前に別のフックによって登録されたものを変更できるようにするために、正しく名前が付けられたすべての変更関数を起動するdrupal_alter()関数もあります。
通常「変更」は参照によって引数を渡すため、オブジェクトを直接編集できますが、「通常の」フックは通常、新しいものを返すようにします。
つまり、Drupalに必要なすべてのフック関数を呼び出して、処理のために返されたものを取得するように要求することで、任意のモジュール(独自のモジュールを含む)を簡単に拡張できます。フック関数を呼び出すモジュールは、フックを実装するモジュールについて何も知る必要はなく、フックを実装するモジュールは、フックを呼び出すモジュールについて本当に知る必要はありません。両方のモジュールが知る必要がある唯一のことは、返されたり変更されたりするデータの構造です。
実際には、フックは最も一般的に次の目的で使用されます。
私にとっては、フックとコア(D7)に関してはmodule_implements関数がすべてです。私が理解することが重要だと思うことの1つは、何かを変更するためのフックを書くことによって、あなたが扱っているデータ構造に何が起こるかについて最後の発言権を持つことは決してないということです。フックは、メニュー、menu_links、ブロック、ノード、ユーザー、エンティティ、レンダー要素など、同じデータ構造に作用する関数の行(キュー)に入るだけです。
したがって、フックが期待どおりに使用されていることを実際に確認するには、自分(フック)が並んでいる場所を知っているか、または認識する必要があります。これはあなたのモンデュルの体重によって決まります。 Drupalコアは、適切に名前が付けられたフックを重みの昇順で呼び出すだけで、データに何が起こっても起こります。
それ以前にフックを書いても効果はありませんでした。ヘッドバンギングを数時間行った後、モジュールの重量が軽すぎて、後続のフックが私が行っていた作業を事実上元に戻したり、まったく無視したりしていたことだけを知りました。
適切に記述されたフックは、それ自体が最後になるように「処理」または「強制」するのではなく、他のフックが期待するとおりにデータ構造を維持することを確実にすることにより、「他のユーザーとうまくやり取り」します。
そしてフックの「ザ・ライン」と言えば。長年にわたり、GoogleでDrupalのようなものを探してきましたが、この画像は、可能性の前処理および処理フックリストを適切に表現しているようです。
フック。モジュールがDrupalコアと対話することを許可します。Drupalのモジュールシステムは「フック」の概念に基づいています。フックはfoo_barという名前のPHP関数です()、ここで、「foo」はモジュールの名前(ファイル名はfoo.module)であり、「bar」はフックの名前です。
フックを使用すると、開発者は既存のコードを変更せずに、要件に応じて既存の機能を変更できます。 PHPの抽象関数に似ています。
例:バスのチケットを予約するためのモジュールを作成しました。コードによると、チケットが一度予約された場合、集荷場所は編集できません。これは、そのプロジェクトの要件でした。ユーザーが集荷場所を変更できることを除いて、友人が同様の要件のために同じモジュールを必要としているとします。どういうわけか彼はあなたのモジュールを使わなければならず、あなたは彼にコードの変更をさせたくないでしょう。そのため、モジュールに変更を加えずに変更を実装できるインターフェース(この場合はフック)を提供します。
drupal drupal-7までは、モジュールとテーマのフックがあります。フックの仕組みを確認するには、drupal.orgをチェックしてください hooks カスタムフックを作成するには リンク
上記の答えはたくさんありますが、フックの背後にある非常に基本的な概念を理解するために、もっと簡単な方法で答えたいと思います。フックは実際にはdrupalコアに組み込まれた関数で、さまざまなことを管理し、コアでさまざまなジョブを実行します。これらの組み込み関数と独自の関数を同期することができますdrupal =異なるフックを呼び出すことにより、独自の関数に機能を追加するコア。
ポイントを獲得していただければ幸いです。