Drupal 7 制御フローのアーキテクチャの概要を説明してくれる人はいますか? おそらく、ページがどのように生成されるかについてのフローチャートの意味で. Drupal がどのように機能するかに関して、どの追加リソースを参照することをお勧めしますか?
8 に答える
Drupalは、関数スタックが比較的深いため、この面で混乱する可能性があります。これは手続き型PHPですが、そのアーキテクチャでは純粋にイベント/リスナーによって駆動され、メインのPHPスクリプトには単純な「フロー」はありません。私は最近、このテーマについてプレゼンテーションを行いました。スライドはslideshareに投稿されていますが、簡単な概要が役立つ場合があります。
- Drupalのindex.phpファイルはフロントサイドコントローラーとして機能します。すべてのページがパイプ処理され、ユーザーが要求した「実際の」URL/パスがパラメーターとしてindex.phpに渡されます。
- Drupalのパスルーターシステム(MenuAPI)は、要求されたパスを特定のプラグインモジュールに一致させるために使用されます。そのプラグインモジュールは、ページの「プライマリコンテンツ」の構築を担当します。
- プライマリページのコンテンツが作成されると、index.phpはtheme('page'、$ content)を呼び出し、Drupalのテーマ/スキニングシステムにコンテンツを渡します。そこでは、サイドバー/ヘッダー/ウィジェットなどにラップされています。
- レンダリングされたページはapacheに戻され、ユーザーのブラウザーに送り返されます。
そのプロセス全体を通して、Drupalおよびサードパーティのプラグインモジュールはイベントを発生させ、それらが応答するのをリッスンします。Drupalはこれを「フック」システムと呼び、関数の命名規則を使用して実装されています。たとえば、「blog」モジュールは、blog_user()という名前の関数を実装することにより、関連する「user」をインターセプトできます。Drupalの用語では、これはhook_user()と呼ばれます。
少し不格好ですが、PHPの癖(ロードされたすべての関数の内部ハッシュテーブルを保持する)により、Drupalは、インストールされているプラグインのリストを繰り返すだけで、リスナーをすばやくチェックできます。プラグインごとに、適切な名前のパターンでfunction_exists()を呼び出し、存在する場合は関数を呼び出すことができます。(「'login'イベントを発生させています。'mymodule_login'関数は存在しますか?それを呼び出します。'yourmodule_login'は存在しますか?いいえ?'nextmodule_login'はどうですか?」など)繰り返しますが、ちょっと不格好ですが、かなりうまく機能します。
Drupalで発生するすべてのことは、これらのイベントの1つが発生したために発生します。MenuAPIは、「menu」イベント(hook_menu)を発生させ、応答するすべてのメタデータプラグインモジュールを収集するため、さまざまなプラグインモジュールによって処理されるURL/パスのみを認識します。(「URL'news /recent'を処理します。これがそのページを作成する必要があるときに呼び出す関数です...」)DrupalのFormAPIがページの作成を担当し、起動するため、コンテンツは保存されるだけです。モジュールが応答する「フォームが送信されました」イベント。hook_cron()がトリガーされ、関数名としてmymodulename_cron()を持つモジュールはすべて、その関数が呼び出されるため、1時間ごとのメンテナンスが行われます。
他のすべては、最終的には単なる詳細です。重要な詳細ですが、そのテーマのバリエーションです。index.phpはコントローラーであり、メニューシステムは「現在のページ」が何であるかを決定し、そのページを構築する過程で多くのイベントが発生します。プラグインモジュールは、これらのイベントにフックして、ワークフローを変更したり、追加情報を提供したりすることができます。これは、多くのDrupalリソースがモジュールの作成に焦点を合わせている理由の一部でもあります。モジュールがなければ、Drupalは実際には言う以外のことは何もしません。それは存在しますか?いいえ?OK、404を出します。」
Drupalがどのように機能するかを理解するには、Drupalのページ提供メカニズムを理解する必要があります。
つまり、すべての呼び出し/ URL /リクエストはindex.phpによって提供され、さまざまなインクルードファイル/モジュールをインクルードし、モジュールで定義された適切な関数を呼び出してリクエスト/URLを提供することでDrupalをロードします。
これは、Drupalのブートストラッププロセスを説明している本ProDrupalDevelopmentからの抜粋です。
ブートストラッププロセス
Drupalは、一連のブートストラップフェーズを経ることにより、すべてのリクエストで自身をブートストラップします。これらのフェーズはbootstrap.incで定義されており、次のセクションで説明するように進行します。
構成の初期化
このフェーズでは、Drupalの内部構成配列にデータを入力し、サイトのベースURL($ base_url)を確立します。settings.phpファイルはinclude_once()を介して解析され、そこで確立された変数または文字列のオーバーライドが適用されます。詳細については、ファイルsites / all / default/default.settings.phpの「VariableOverrides」および「StringOverrides」セクションを参照してください。
初期のページキャッシュ
高レベルのスケーラビリティが必要な状況では、データベース接続を試行する前に、キャッシングシステムを呼び出す必要がある場合があります。初期のページキャッシュフェーズでは、コンテンツを引き継いでブラウザに返すpage_cache_ fastpath()という関数を含むPHPファイルを(include()を使用して)含めることができます。初期ページキャッシュは、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 に進み、そのディレクトリ内の他のスクリプトをいくつか読むことをお勧めします。
主なインクルード ファイル:
- menu.inc は、コンテンツへの URL の暗黙的なマッピングの多くを処理するため、システム全体がどのように機能するかを理解するために非常に重要です。
- common.inc には、API の基礎を形成する不思議な関数のほとんどが含まれています。
- module.inc は、イートンが言及したフック呼び出しを処理します
- form.incは、フォームの表示、送信、および処理を扱います
- theme.inc がプレゼンテーションを担当します。
modules/ ディレクトリにはいくつかの重要な機能もあります。特に、modules/node/node.module は、一般にサイト コンテンツをカプセル化するために使用されるノード システムの基礎を形成します。
コードは、一般に、非常によくコメントされており、明確です。コメント内での Doxygen マークアップの使用は、コードが事実上正規のドキュメントであることを意味します。
関数の定義にすばやくジャンプできるエディターを使用してこれを行うことも役立ちます。ctags と組み合わせて vim を使用するとうまくいきます。.inc、.module などのファイルを php ファイルとしてインデックス化するように ctags に指示する必要があります。
このテーマに関する最高の本は、「Pro Drupal Development」と「Using Drupal」です。
「Pro Drupal Development」には、Drupal の各 API (フォーム、テーマなど) のいくつかの優れたフローチャートと完全な要約が含まれています。これは、独自のモジュールやテーマを作成する人々に特に役立つことを目的としていますが、Drupal を理解したい平均的な PHP に精通した開発者にとっては多くの価値があります。それに加えて、さまざまなフォームのフィールドを選択的に非表示にするなどのことをさらに制御するために、構築したすべてのサイト用にカスタム モジュールを作成しました (これは通常、エンド フォームのノード フォームを簡素化するために行います)。ユーザー) であるため、この知識を帽子の下に置いておくとよいでしょう。
「Using Drupal」は、ギャラリー、ブログ、ソーシャル ネットワーキング サイトなどの優れたものを構築する方法を知りたいサイト開発者を対象としています。いくつかの使用例を紹介し、各ジョブを実行するように既存のモジュールを構成する方法を示します。その過程で、必須のアドオン モジュールである「コンテンツ コンストラクション キット」(CCK)と「ビュー」、カスタム ブロックとテンプレートの作成方法、Drupal サイトの維持管理について詳しく説明します。この本は、Drupal をすぐに使いこなしたい人に特にお勧めします。その過程で、Drupal の内部組織について理解を深めます。
drupal .php コードを NetBeans プロジェクトにインポートすることで負荷について学びました。その後、netbeans デバッガーを実行して、ページのさまざまなフェーズが一緒になるのを確認できます。
ここに新しい寄稿者が来て、会話から 2 年遅れました ;-)
https://stackoverflow.com/a/1070325/1154755に返信中
コア機能を拡張するために、それを書き直さないでください。代わりに、モジュールを /sites/all/modules/ または /sites/ [yoursite] /modules にコピーしてそれを拡張するか、それらの場所に新しいモジュールを作成します。テーマについても同じです。
実際、コアモジュールをコピーして更新する必要はありませんでした。Drupal Hooks だけで十分です。
テーマについては、それが唯一の方法である場合もありますが、多くの場合、必要な結果を得るためにサブテーマを構築できます。