web-dev-qa-db-ja.com

Drupal=?

誰かがDrupal 7制御フローのアーキテクチャの概要を提供できますか?おそらくページの生成方法に関するフローチャートの意味で。 Drupalの仕組みに関して、コンサルティングを提案する追加リソースはありますか?

149
alice

Drupalは、このフロントでは混乱を招く可能性があります。これは、部分的に比較的深い関数スタックがあるためです。手続き型ではありますが、PHPアーキテクチャで駆動される純粋なイベント/リスナーであり、メインのPHPスクリプトを見るための単純な「フロー」はありません。私は最近 このテーマに関するプレゼンテーション を行いました。スライドはslideshareに投稿されていますが、簡単な高レベルの概要が役に立つかもしれません。

  • Drupalのindex.phpファイルは、フロントサイドコントローラーとして機能します。すべてのページはそれを介してパイプされ、ユーザーが要求した「実際の」URL /パスはパラメーターとしてindex.phpに渡されます。
  • Drupalのパスルーターシステム(MenuAPI)は、要求されたパスを特定のプラグインモジュールに一致させるために使用されます。そのプラグインモジュールは、ページの「プライマリコンテンツ」の構築を担当します。
  • プライマリページのコンテンツが構築されると、index.phpはtheme( 'page'、$ content)を呼び出します。これにより、コンテンツがDrupalのテーマ/スキンシステムに渡されます。そこでは、サイドバー/ヘッダー/ウィジェット/などでラップされています。
  • レンダリングされたページはApacheに返され、ユーザーのブラウザーに送り返されます。

そのプロセス全体で、Drupalとサードパーティのプラグインモジュールがイベントを起動し、それらの応答を待機しています。Drupalこれを「フック」システムと呼びます関数の命名規則を使用して実装されます。たとえば、「ブログ」モジュールは、blog_user()という名前の関数を実装することで、関連する「ユーザー」をインターセプトできます。Drupal hook_user()

それは少し不格好ですが、PHP癖(すべてのロードされた関数の内部ハッシュテーブルを保持します)により、Drupalインストールされたプラグインのリストを反復処理します。プラグインごとに、適切な名前のパターンでfunction_exists()を呼び出し、存在する場合は関数を呼び出します(「 'login'イベントを起動しています。 「yourmodule_login」は存在しますか?いいえ?「nextmodule_login」はどうですか?」など)繰り返しますが、不器用なタッチですが、かなりうまく機能します。

Drupal=で発生するすべてのイベントは、発生するイベントの1つが原因で発生します。MenuAPIは、どのURL/「menu」イベント(hook_menu)を起動し、応答するすべてのメタデータプラグインモジュールを収集するため、パスは異なるプラグインモジュールによって処理されます(「news/recent」というURLを処理します。そのページを構築する必要があるときに呼び出します...」)DrupalのFormAPIはページの構築を担当し、モジュールが応答する「フォームが送信された」イベントを発生させるため、コンテンツのみが保存されます。hook_cron( )がトリガーされ、関数名としてmymodulename_cron()を含むモジュールは、その関数を呼び出します。

他のすべては最終的には単なる詳細であり、重要な詳細ですが、そのテーマのバリエーションです。 index.phpはコントローラーであり、メニューシステムは「現在のページ」が何であるかを決定し、そのページを構築するプロセスで多くのイベントが発生します。プラグインモジュールは、これらのイベントにフックして、ワークフローを変更したり、追加情報を提供したりできます。それはまた、多くのDrupalリソースがモジュールの作成に集中している理由の一部です。モジュールがなければ、Drupalは実際に誰かが尋ねた以外に何もしません。ページのために!それは存在しますか?いいえ?OK、404を提供します。

157
Eaton

Drupal Page Serving Mechanism

Drupalの仕組みを理解するには、Drupalのページ提供メカニズムを理解する必要があります。

要するに、すべての呼び出し/ url /リクエストは、さまざまなインクルードファイル/モジュールをインクルードし、リクエスト/ urlを処理するためにモジュールで定義された適切な関数を呼び出すことにより、Drupalをロードするindex.phpによって処理されます。

以下は、Pro Drupal Developmentから抜粋したもので、Drupalのbootstrapプロセスについて説明しています。

Bootstrapプロセス

Drupalは、一連のbootstrapフェーズを通過することにより、すべてのリクエストで自身をブートストラップします。これらのフェーズは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()関数を明示的に呼び出すことで追加されます)。

Late Page Cache

後期ページキャッシュフェーズでは、Drupalは、ページキャッシュからページを提供するかどうかを決定するのに十分なサポートコードをロードします。これには、データベースの設定を、構成の初期化段階で作成された配列にマージし、モジュールコードをロードまたは解析することが含まれます。リクエストが匿名ユーザーによって発行されたことがセッションで示され、ページキャッシングが有効になっている場合、ページはキャッシュから返され、実行が停止します。

言語決定

言語決定フェーズでは、Drupalの多言語サポートが初期化され、サイトとユーザーの設定に基づいて、現在のページの提供に使用する言語が決定されます。 Drupalは、パスプレフィックスやドメインレベルの言語ネゴシエーションなど、言語サポートを決定するためのいくつかの代替手段をサポートしています。

パス

パスフェーズでは、パスとパスエイリアシングを処理するコードがロードされます。このフェーズでは、人間が読めるURLを解決し、内部Drupalパスキャッシングとルックアップを処理できます。

フル

このフェーズでは、共通機能のライブラリ、テーマのサポート、コールバックマッピング、ファイル処理、Unicode、bootstrapイメージツールキット、フォームの作成と処理、メールのサポートをロードして、PHPプロセスを完了します。処理、自動ソート可能なテーブル、および結果セットのページング。 Drupalのカスタムエラーハンドラが設定され、有効なモジュールがすべてロードされます。最後に、Drupalはinitフックを起動します。これにより、モジュールはリクエストの正式な処理が開始される前に通知を受けることができます。

Drupalがブートストラップを完了すると、フレームワークのすべてのコンポーネントが利用可能になります。ブラウザのリクエストを受け取って、それを処理するPHP関数に渡します。 URLとそれらを処理する関数間のマッピングは、URLマッピングとアクセス制御の両方を処理するコールバックレジストリを使用して実現されます。モジュールは、メニューフックを使用してコールバックを登録します(詳細については、第4章を参照してください)。

Drupalが、ブラウザー要求のURLが正常にマッピングされるコールバックが存在し、ユーザーがそのコールバックへのアクセス許可を持っていると判断した場合、コールバック関数に制御が渡されます。

リクエストの処理

コールバック関数は、要求を満たすために必要なデータを処理および蓄積するために必要なあらゆる作業を行います。たとえば、 http://example.com/ q = node/3などのコンテンツのリクエストを受信した場合、URLはnode.moduleの関数node_page_view()にマッピングされます。さらに処理すると、そのノードのデータがデータベースから取得され、データ構造に入れられます。次に、テーマを設定します。

データのテーマ化

テーマには、取得、操作、または作成されたデータをHTML(またはXMLまたはその他の出力形式)に変換することが含まれます。 Drupalは、管理者が選択したテーマを使用して、Webページに正しいルックアンドフィールを与えます。結果の出力は、Webブラウザー(または他のHTTPクライアント)に送信されます。

60
amitgoyal

イートンの答えは、良い概要を提供します。 (私はここに新しいので、彼を修正することはできません、したがってコメントです。)

私にとって残酷な "aha"の瞬間は、すべてがindex.phpを介して、次にモジュールのウォーターフォールを介して(コアが最初に、次にサイトが)発生することを認識していました。コア機能を拡張するために書き換えないでください。代わりに、モジュールを/ sites/all/modules /または/ sites/[yoursite]/modulesにコピーしてTHATを拡張するか、それらの場所に新しいモジュールを作成します。テーマについても同じです。モジュールディレクトリには、tpl、cssなどの形式で表示コードを含めることもできます。

Railsのようなより厳密なMVCタイプのフレームワークに慣れている場合、Djangoなど。これはすべて少し混乱します。モジュールは多くの表示コードを混在させることができ、他のモジュールやテンプレートは、最終的にスタックを逆方向に歩いていくことになりますPHPで作業することの美しさ/痛みです。

皮肉なことに、「アプリを作成するだけ」がこれを学ぶ最悪の方法かもしれません。 Drupalは、制御フローを理解するまではわかりにくいものです。tplファイルには、l()の由来です。

20
axoplasm

http://drupal.org/handbooks

ハンドブック、特にテーマ開発者ガイドを読んでください。 Drupalはいくつかのテーマエンジンをサポートしています。Zenはphptemplateを使用しているため、ガイドのその部分に注意してください。

モジュール開発の場合、APIはapi.drupal.orgで文書化されています。

特に情報をすばやく取得する必要がある場合 http://www-128.ibm.com/developerworks/ibm/osource/implement.html

9
joe

それは、あなたが探している理解の深さに依存します。 PHPについて十分な知識がある場合は、index.phpから始めて、includes/bootstrap.incに進み、そのディレクトリ内の他のスクリプトに進むコード自体を読むことをお勧めします。

キーインクルードファイル:

  • menu.incは、URLからコンテンツへの暗黙的なマッピングの多くを処理するため、システム全体の動作を理解する上で非常に重要です。
  • common.incには、APIの基礎を形成する、そうでなければ神秘的な機能のほとんどがあります。
  • module.incは、Eatonが言及したフック呼び出しを処理します
  • form.incは、フォームの表示、送信、処理を扱います
  • theme.incはプレゼンテーションを処理します。

Modules /ディレクトリにはいくつかの重要な機能もあります。特に、modules/node/node.moduleはノードシステムの基礎を形成します。これは一般に、サイトコンテンツのカプセル化に使用されるものです。

一般に、コードは非常によくコメントされており、明確です。コメント内でのDoxygenマークアップの使用は、コードが事実上標準的なドキュメントであることを意味します。

また、関数の定義にすばやくジャンプできるエディターを使用してこれを行うことも役立ちます。 vimをctagsと組み合わせて使用​​するとうまくいきます。 .inc、.moduleなどのファイルをphpファイルとしてインデックス付けするようにctagsに指示する必要があります。

7
intuited

drupal .phpコードをNetBeansプロジェクトにインポートすることで負荷を学習しました。その後、netbeansデバッガーを実行して、ページのさまざまなフェーズが統合されるのを確認できます。

5
Ben Hammond

このテーマに関する最高の本は、「Pro Drupal Development」および「Drupalの使用」です。

「Pro Drupal Development」には、いくつかのニースのフローチャートと、Drupalの各API(フォーム、テーマなど)の詳細な要約が含まれます。独自のモジュールやテーマを作成する人に特に有益です。しかし、Drupalを理解したい平均的なPHPに精通した開発者には多くの価値があります。さらに、構築したすべてのサイトにカスタムモジュールを作成し、さまざまなフィールドを選択的に非表示にするフォーム(エンドユーザー向けのノードフォームを単純化するために一般的に行いたい)ですので、この知識を身に付けておくとよいでしょう。

「Drupalの使用」は、ギャラリー、ブログ、ソーシャルネットワーキングサイトなどの優れたものを構築する方法を知りたいサイト開発者を対象としています。いくつかのユースケースを経て、各ジョブを実行するように既存のモジュールを構成する方法を示します。このプロセスでは、重要なアドオンモジュールである「コンテンツ構築キット」(CCK)と「ビュー」、カスタムブロックとテンプレートの作成方法、およびDrupalサイト。この本をお勧めします。特に、速度を上げて実際に使用したい人にはお勧めです。Drupal=すぐに。Drupalの内部組織を理解します。

5
Scott Lahteine

これ (for Drupal 6)& this (for Drupal 7)はかなり良いアーキテクチャですdrupalの概要。詳細が必要な場合は、ドキュメントのmostの何かを書き始めるとよいでしょう。具体的に達成するものがなければ、何かを試すよりもはるかに困難になります。

5
Jeremy French

ここに新しい貢献者、会話に2年遅れ;-)

返信する https://stackoverflow.com/a/1070325/1154755

コア機能を拡張するために書き換えないでください。代わりに、モジュールを/ sites/all/modules /または/ sites /[yoursite]/ modulesにコピーしてTHATを拡張するか、それらに新しいモジュールを作成します場所。テーマについても同じです。

実際、コアモジュールをコピーして更新する必要はありませんでした。 Drupalフックがあれば十分です。

テーマについては、そうである場合もありますが、それが唯一の方法である場合もありますが、多くの場合、必要な結果を得るためにサブテーマを作成できます。

4
Robin Millette