Drupalの仕組み [閉まっている]


151

誰かがDrupal 7制御フローのアーキテクチャの概要を教えてくれませんか?おそらく、ページがどのように生成されるかについてのフローチャートの意味で。Drupalのしくみに関して相談することを勧めるその他のリソースを教えてください。


1
質問?そして、なぜあなたはそれを自分で聞いていなかった:-)
liori

当時はスタックオーバーフローの方法はなかったと思います。:)
ジェレミーフランス語

2
Drupalコミュニティは常に、ドキュメント作成を手伝ってくれる人を探しています。ドキュメンテーションが不器用であるか、チュートリアルが不十分であるかどうか助けてみませんか?:)
リミアン

4
文書化には理解が必要です。文書化または多くの経験が必要です
Damon

回答:


160

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

  • 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」イベントを発生させています。「mymodule_login」関数は存在しますか?それを呼び出します。「yourmodule_login」は存在しますか?いいえ?「nextmodule_login」はどうですか?」など)繰り返しますが、少し不格好ですが、それはかなりうまくいきます。

Drupalで発生することはすべて、これらのイベントの1つが発生したために発生します。MenuAPIは、「メニュー」イベント(hook_menu)を発生させ、応答するすべてのメタデータプラグインモジュールを収集するため、異なるプラグインモジュールで処理されるURL /パスについてのみ認識します。(「私はURL 'news / recent'を処理します。ここに、そのページを作成する必要があるときに呼び出す関数があります...」)コンテンツが保存されるのは、DrupalのFormAPIがページの作成を担当しているためです。モジュールが応答するための「フォームが送信されました」イベント。hook_cron()がトリガーされ、関数名としてmymodulename_cron()を持つモジュールが呼び出されるため、1時間ごとのメンテナンスが発生します。

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


1
FWIW、D7では少し異なります(theme( 'page')がなくなり、シンボルはコードレジストリにキャッシュされます)。ただし、全体的なプロセスは同じです。
FGM

2
素晴らしい説明イートン、ここで時間を過ごしてくれてありがとう。私の質問は、各モジュールにvar_dumpを入れて何が起こったのかを調べる以外に、どのようにデバッグするのですか?
ブライアンG

3
良い質問。デバッグ対象によって異なります。開発モジュールをインストールすると、いくつかの便利なツールが提供されます。ステップ(ほとんどの場合)は、特定のページの作成に責任があるモジュールを識別することです。hook_menu()はurls / pathsをモジュールにマップするので、それが役立ちます。次に、そのメニューコールバックが何をしているかを特定します-drupal_get_form()を呼び出してフォームを構築するか、theme( 'some_custom_thing')を呼び出してHTMLを構築します。他のイベントをトリガーするdrupal_alter()やmodule_invoke_all()などの関数の使用に注意してくださいモジュールも...
Eaton

私はこれがとても役に立ちました。Drupal 7の違いを知っていますか?
Hortitude 2009年

D7更新:(参照) drupal.org/node/350780
dreftymac

63

Drupalページ配信メカニズム

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

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

これは、Drupalのブートストラッププロセスを説明する本「Pro Drupal Development」の抜粋です。

ブートストラッププロセス

Drupalは、一連のブートストラップフェーズを実行することにより、すべてのリクエストで自身をブートストラップします。これらのフェーズはbootstrap.incで定義されており、次のセクションで説明するように進行します。

構成の初期化

このフェーズでは、Drupalの内部構成配列にデータを取り込み、サイトのベースURL($ base_url)を確立します。settings.phpファイルはinclude_once()を介して解析され、そこで確立された変数または文字列のオーバーライドが適用されます。詳細については、sites / all / default / default.settings.phpファイルの「変数のオーバーライド」および「文字列のオーバーライド」のセクションを参照してください。

早期ページキャッシュ

高レベルのスケーラビリティが必要な状況では、データベース接続が試行される前に、キャッシングシステムを呼び出す必要がある場合があります。初期のページキャッシュフェーズでは、(include()を使用して)page_cache_ fastpath()という関数を含むPHPファイルをインクルードし、コンテンツを引き継いでブラウザーに返すことができます。初期ページキャッシュは、page_cache_fastpath変数をTRUEに設定することで有効になり、含めるファイルは、cache_inc変数をファイルのパスに設定することで定義されます。例については、キャッシングに関する章を参照してください。

データベースを初期化

データベースフェーズでは、データベースのタイプが決定され、データベースクエリに使用される初期接続が作成されます。

ホスト名/ IPベースのアクセス制御

Drupalでは、ホスト名/ IPアドレスごとにホストを禁止できます。アクセス制御フェーズでは、要求が禁止されたホストからのものかどうかを確認するために簡単なチェックが行われます。その場合、アクセスは拒否されます。

セッション処理の初期化

DrupalはPHPの組み込みセッション処理を利用しますが、一部のハンドラーを独自のものでオーバーライドして、データベースに基づくセッション処理を実装します。セッションは、セッションフェーズで初期化または再確立されます。現在のユーザーを表すグローバル$ userオブジェクトもここで初期化されますが、効率を上げるためにすべてのプロパティを使用できるわけではありません(これらは必要に応じてuser_load()関数の明示的な呼び出しによって追加されます)。

レイトページキャッシュ

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

言語決定

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

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

いっぱい

このフェーズでは、共通機能のライブラリ、テーマサポート、コールバックマッピング、ファイル処理、Unicode、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クライアント)に送信されます。


20

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

私にとっての残忍な「アハ」の瞬間は、すべてがindex.phpを介して、次にモジュールの滝(最初はコア、次にサイト)を介して行われることに気付いていました。コア機能を拡張するために、それを書き直さないでください。代わりに、モジュールを/ sites / all / modules /または/ sites / [yoursite] / modules にコピーして拡張するか、それらの場所に新しいモジュールを作成します。テーマも同じです。モジュールディレクトリには、tpl、cssなどの形式で表示コードも含めることができます。

Rails、DjangoなどのMVCタイプのフレームワークをより厳密に使用している場合、これらはすべて少し混乱します。モジュールは多くの表示コードに混在する可能性があり、誰か他の人のモジュールやテンプレートを見ていると、結局はスタックを逆方向に歩いていくことになります。これがPHPで作業することの美しさや苦痛です。

皮肉なことに、「アプリをビルドするだけ」がこれを学ぶための最悪の方法かもしれません。Drupalは、制御フローを理解するまで、箱から出して多くのことを行います。たとえば、l()のような楽しい名前の関数がどこから来たかを示すtplファイルには何もありません。


7

それはあなたが探している理解の深さに依存します。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マークアップを使用するということは、コードが事実上正規のドキュメントであることを意味します。

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


5

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


5

このテーマに関する最高の本は「Pro Drupal Development」と「Using Drupal」です。

「Pro Drupal開発」には、いくつかの素晴らしいフローチャートと、Drupalの各API(フォーム、テーマなど)の完全な要約が含まれています。これは、独自のモジュールとテーマを作成する人々に特に有益であることを目的としていますが、Drupalを理解したい平均的なPHPに精通した開発者に多くの価値があります。その上、さまざまなフォームのフィールドを選択的に非表示にするなどの追加の制御を取得するために、構築したすべてのサイトのカスタムモジュールを作成しました(これは通常、エンドフォームのノードフォームを簡略化するために行います)ユーザー)ので、あなたの帽子の下でこの知識を持っていることは良いことです。

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


5

これは、&(Drupalの6のために)これは(Drupalの7用)のDrupalのかなり良いアーキテクチャの概要です。詳細が必要な場合は、ほとんどのドキュメントが良いものを書き始めます。達成する具体的なものなしに、詳細レベルでそれを学ぶことは、何かを試すことよりもはるかに困難になります。


4

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

https://stackoverflow.com/a/1070325/1154755に返信

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.