誰かがDrupal 7制御フローのアーキテクチャの概要を教えてくれませんか?おそらく、ページがどのように生成されるかについてのフローチャートの意味で。Drupalのしくみに関して相談することを勧めるその他のリソースを教えてください。
誰かがDrupal 7制御フローのアーキテクチャの概要を教えてくれませんか?おそらく、ページがどのように生成されるかについてのフローチャートの意味で。Drupalのしくみに関して相談することを勧めるその他のリソースを教えてください。
回答:
Drupalは、関数スタックが比較的深いため、この面で混乱する可能性があります。これは手続き型のPHPですが、そのアーキテクチャでは純粋にイベント/リスナー駆動型であり、メインのPHPスクリプトには見やすい単純な「フロー」はありません。私は最近、このテーマについてプレゼンテーションを行いました。スライドはスライドシェアに投稿されていますが、簡単な概要が役立つ場合があります。
そのプロセス全体の間、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を提供します。」
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クライアント)に送信されます。
イートンの答えは良い概観を提供します。(私はここに新しいので、彼を改造することはできません。したがってコメントです。)
私にとっての残忍な「アハ」の瞬間は、すべてがindex.phpを介して、次にモジュールの滝(最初はコア、次にサイト)を介して行われることに気付いていました。コア機能を拡張するために、それを書き直さないでください。代わりに、モジュールを/ sites / all / modules /または/ sites / [yoursite] / modules にコピーして拡張するか、それらの場所に新しいモジュールを作成します。テーマも同じです。モジュールディレクトリには、tpl、cssなどの形式で表示コードも含めることができます。
Rails、DjangoなどのMVCタイプのフレームワークをより厳密に使用している場合、これらはすべて少し混乱します。モジュールは多くの表示コードに混在する可能性があり、誰か他の人のモジュールやテンプレートを見ていると、結局はスタックを逆方向に歩いていくことになります。これがPHPで作業することの美しさや苦痛です。
皮肉なことに、「アプリをビルドするだけ」がこれを学ぶための最悪の方法かもしれません。Drupalは、制御フローを理解するまで、箱から出して多くのことを行います。たとえば、l()のような楽しい名前の関数がどこから来たかを示すtplファイルには何もありません。
それはあなたが探している理解の深さに依存します。phpについて十分な知識がある場合は、コード自体を読み、index.phpから始めて、includes / bootstrap.incに進み、そのディレクトリにある他のスクリプトのいくつかに進んでください。
キーインクルードファイル:
また、modules /ディレクトリにはいくつかの重要な機能があります。特に、modules / node / node.moduleはノードシステムの基礎を形成します。これは一般に、サイトコンテンツのカプセル化に使用されるものです。
コードは、一般的に、非常によくコメントされ、明確です。コメント内でDoxygenマークアップを使用するということは、コードが事実上正規のドキュメントであることを意味します。
また、関数の定義にすばやくジャンプできるエディターを使用してこれを行うこともできます。私はctagsと組み合わせてvimを使用するとうまくいきます。ctagsに.inc、.moduleなどのファイルをphpファイルとしてインデックス付けするように指示する必要があります。
このテーマに関する最高の本は「Pro Drupal Development」と「Using Drupal」です。
「Pro Drupal開発」には、いくつかの素晴らしいフローチャートと、Drupalの各API(フォーム、テーマなど)の完全な要約が含まれています。これは、独自のモジュールとテーマを作成する人々に特に有益であることを目的としていますが、Drupalを理解したい平均的なPHPに精通した開発者に多くの価値があります。その上、さまざまなフォームのフィールドを選択的に非表示にするなどの追加の制御を取得するために、構築したすべてのサイトのカスタムモジュールを作成しました(これは通常、エンドフォームのノードフォームを簡略化するために行います)ユーザー)ので、あなたの帽子の下でこの知識を持っていることは良いことです。
「Drupalの使用」は、ギャラリー、ブログ、ソーシャルネットワーキングサイトなどの優れたものを構築する方法を知りたいサイト開発者を対象としています。いくつかの使用例を経て、既存のモジュールを構成して各ジョブを実行する方法を示します。その過程で、重要なアドオンモジュール「コンテンツ構築キット」(CCK)と「ビュー」、カスタムブロックとテンプレートを作成する方法、およびDrupalサイトを維持するための内外について理解します。私はこの本を特にスピードを上げて実際にDrupalをすぐに使用したい人に勧めます。その過程で、Drupalの内部組織を理解します。
ここに新しい貢献者、会話が2年遅れました;-)
https://stackoverflow.com/a/1070325/1154755に返信
コア機能を拡張するために、それを書き直さないでください。代わりに、モジュールを/ sites / all / modules /または/ sites / [yoursite] / modules にコピーして拡張するか、それらの場所に新しいモジュールを作成します。テーマも同じです。
実際、コアモジュールをコピーして更新する必要はありませんでした。Drupalフックで十分です。
テーマについては、ええ、それが唯一の方法である場合もありますが、多くの場合、必要な結果を得るためにサブテーマを作成できます。