6

最小限のモジュールインストール(物事を単純にするため)を想定すると、Drupalの2つのトップレベル機能のコア「責任」はindex.php何ですか?

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

Drupalのコアシステムがどのように機能するか、特にWebベースのMVCとの関係で、高レベルから理解しようとしています。したがって、Code Igniterのようなシステムでは、次のようになります。

  1. URLを調べて、クラスとアクションに変換します

  2. 情報がモデルからロードされるクラスのアクションメソッドを呼び出し、「ビジネスロジック」が実行されます

  3. 情報はビューレイヤーに渡されます

  4. レイアウトシステムはHTMLページをレンダリングします

  5. レイアウトの一部(多くの場合「コンテンツ領域」)は、ステップ3で渡された情報によって駆動されます。

Drupalでの同等のディスパッチプロセスは何ですか?モジュールシステムがどのように機能するかは理解していますが、データの読み込みとテーマ/レイアウトのレンダリングの方法/理由、および2つの間のハンドオフが発生する場所に関するDrupalの哲学に完全には従いません。

DrupalはWebアプリMVCシステムとは根本的に異なることに気づきました。私はその方法を理解しようとしています。Drupalは、これを完全に理解していなくてもうまく使用できるように設計されていることを理解しています。Drupal 7の回答が優先されますが、根本的な変更があった場合は、以前のバージョンからの情報を歓迎します。

4

3 に答える 3

14

BerdirとApemantusからの良い答えはすでに(+1)ですが、追加の試行の余地があります:

DrupalsとMVCの関係については、「Drupalモジュールの内部動作のメタファー」という質問に対するこの回答でトピックを突き刺しました。これは、「高レベル」の概要に対するあなたの要求に適合する可能性があります。

theme('page, $return)トップレベルの関数呼び出しについては、3つに分かれているものもあるので、この呼び出しを組み合わせて、概要を完成させることをお勧めします。

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$return = menu_execute_active_handler();

// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    // [...] Snipped error page handling code
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}
drupal_page_footer();

一つずつ:

  1. drupal_bootstrap()
    名前が示すように、これは主に「ステージの設定」に関係しています。

    • 基本構成を初期化する
    • データベースアクセスを初期化する
    • セッション処理を初期化します
    • 要求しているユーザーを特定する
    • 最終的には、キャッシュされたコンテンツを提供することでリクエストをショートカットします
    • ...(その他)

    ここで重要な点は、すでにこのフェーズ中に、フックシステムが他のモジュールを呼び出し、要求があれば、この初期フェーズでカスタムロジックを挿入する機会を与えることです。モジュールがこれを行うことは一般的ではありませんが、Drupalの柔軟性に加えて、ユーザー識別プロセスへの影響、キャッシュヒットの防止または強制、要求されたパスの書き換え、その他の低レベルなどの特別なニーズに対応できます。 '操作。

  2. menu_execute_active_handler()
    これは、CodeIgniterスケッチのステップ1と2にほぼ一致します。要求されたパスを検査し、適切なコールバック関数(「ワイルドカードをパラメーターに変換する」ロジックを含む)と照合し、そのコールバックを呼び出して、抽出された(または事前定義された)パラメーターを渡します。コールバックは通常、メインページのコンテンツを返すことが期待されていますが、リクエストをリダイレクトするなど、他のことも自由に行うことができます。ほとんどの「ビジネスロジック」はここで実行されますが、返されるコンテンツはすでにマークアップフラグメントであることが非常に多いため、このフェーズにはビューレイヤーの一部がすでに含まれていることに注意してください。

  3. theme_page()(関数を介して間接的に呼び出されtheme()、周囲の多くの「魔法」が追加されます)
    これは、返されるマークアップの最終的なアセンブリが行われる場所であるため、通常のビューレイヤーとほぼ一致します。ただし、ページの「周囲」の要素(メニュー、ヘッダー、サイドバーなど)が組み立てられる場所でもあるため、この段階でも「ビジネスロジック」が進行する可能性があります。

これらすべてのステップで、フックシステム(および同様に設計されたテーマシステム)は、必要に応じて、他のモジュールが「サブスクライブ」するためのかなりの数の「フックイン」ポイントを提供します。呼び出されると、その時点で処理されている関連情報が渡され、ステップインして操作する(または単に別の処理をトリガーする)オプションがあります。これらすべてが非常に柔軟なシステムになります(カスタムモジュールの「インターセプトと操作」オプションが大量にあるため)が、「いつ何が起こるか」という問題として、Drupalの学習における多くの困難の原因にもなります。多くの場合、簡単には答えられません:/

簡単にまとめると、次のようになります。

  1. ブートストラップ-初期化のうなり声の作業、最終的には「ビジネスロジック」の初期の侵入で強化されます。
  2. 実行-メインの「ビジネスロジック」処理、すでにいくつかの「ビュー」生成ロジック(マークアップフラグメントのアセンブリ)。
  3. テーマ-「ビジネスロジック」のいくつかの重要な部分がまだ混在している、メインのマークアップ生成。
于 2011-02-15T23:03:59.053 に答える
3

http://drupaldepth.blogspot.com/2009/07/flow-of-drupal.htmlをご覧ください

于 2011-02-15T16:51:50.270 に答える
3

ブートストラップ後、発生するのはメニュールーターシステムだけです。メニュールーターシステムは、このリクエストの原因となっているページコールバックを特定します。これを行うには、インストールされているすべてのモジュールがhook_menu()定義で返された情報に依存します(これはデータベースに保存され、新しいモジュールが有効になっている場合など、明示的に要求された場合にのみ更新されます)。

そのフックは多くを制御することができます。たとえば、アクセス許可、引数の定義、メニューリンクのタイトルなどです。また、メニュールーターは、通常のコントローラー/アクションパターンに限定されず、必要に応じてほぼ複雑にすることができます。たとえば、「yourmodule / view /%/ sub /%/%/whatever」のように最大9要素の深さのメニュールーター項目を定義できると思います。

例を含む簡単な概要については、http://drupal.org/node/109131を参照してください。

そのページコールバック内で、提供モジュールは自由にやりたいことができます。必要に応じてテーマシステム使用したり、フックを起動したり、ページの「コンテンツ」部分で他のことを実行したりできます。テーマシステムには、他の領域やそれらの領域に自動的に含まれる他のブロックを含む、テーマページの他のすべての部分が含まれます。これは、AJAXリクエストに応答したり、xmlフィードなどを提供したりするコールバックを作成するときに覚えておくことが重要です。そのような場合、テーマの「残り」を含めるべきではないリクエストに対応するために、テーマを調整するためのさらなる手順を実行する必要があります。ページ。

于 2011-02-15T17:29:21.670 に答える