ホームページ >バックエンド開発 >PHPチュートリアル >リクエストから応答へ:Drupal 8内部への旅

リクエストから応答へ:Drupal 8内部への旅

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-17 11:11:38948ブラウズ

Drupal 8(およびSymfony2)への深さ:リクエスト対応プロセス

コアポイント

    Drupal 8は、Symfony2のhttpkernelおよびhttpfoundationコンポーネントを使用して、ユーザー要求と応答を処理し、オブジェクト指向の方法でリクエストをカプセル化し、アプリケーションに渡し、応答を返します。
  • httpkernelコンポーネントは、index.phpファイルでプロセスを開始し、イベント駆動型プロセスを使用するSymfonyベースのアプリケーションの中核です。これにより、アプリケーションがより柔軟になり、タスクをこれらのイベントのリスナーに委任できます。
  • コントローラーが応答オブジェクトを返さない場合、カーネルはkernel.viewイベントをトリガーし、サブスクライバーはコントローラーの結果を実際の応答オブジェクトに変換する責任があります。この柔軟性により、コントローラーは、オブジェクトを正しい応答に変換するビューイベントサブスクライバーと組み合わされている限り、あらゆる種類のオブジェクトを返すことができます。
  • HTMLRENDERERが最も一般的に使用されるメインコンテンツレンダラータイプとして、ページバリアントの概念を使用してページを構築します。このプロセスは、htmlrenderのprepare()メソッドで発生します。これは、#type =&gt '' page 'renderresponse()メソッドを提供します。次に、#type => 'html'レンダリングアレイを使用してラップします。
Drupal 8モジュール開発に関する最初の記事では、このプロセスのルーティングの側面について少し学びました。パスでページを作成することは、コントローラーに一致するルートを宣言する問題にすぎないことがわかりました。ご覧のとおり、後者はマーカーとして解釈され、そのページのメインコンテンツ領域に表示されるレンダリングされた配列を返すことができます。しかし、舞台裏では、Drupalが実際にその配列を

応答オブジェクトに変換し、Symfonyのhttpkernelinterface Regulationsに従って変換していることをご存知ですか?

この記事では、Drupal 8(およびSymfony2)の内部構造をより深く見て、ユーザーが見る時間にリクエストをする瞬間に実際に何が起こるか(そして何が起こるか)を理解したいと思います。彼らが物事を返す応答)。上記の例は、このプロセスが進むことができる1つの方向に過ぎず、今日は他の可能性が見られます。目標は、システムの柔軟性を理解することです。これにより、優れたアプリケーションの構築に役立ちます。 From Request to Response: A Journey into Drupal 8 Internals より深く掘り下げる前に、このチャートをチェックすることを強くお勧めします。レンダリングシステムは写真の一部にすぎないため、名前が示唆する以上のものを表しているように思えますが。

フロントエンドコントローラー(index.php)

Symfony2は現在、Drupalの重要な部分です。後者は多くのSymfonyコンポーネントを使用しています。この記事の最も重要なコンポーネントは、httpkernelおよびhttpfoundationコンポーネントです。一緒に、彼らはユーザー要求をカプセル化し、それらをアプリケーションに渡し、その後、一貫したオブジェクト指向の方法で返されたコンテンツをユーザーに返す責任があります。

httpkernelInterface(他のコンテキストからも聞いたことがあるかもしれません)リクエストオブジェクトを受信し、常に応答オブジェクトを返すことにより、これらすべてを接着します。非常にシンプルだが強力なコンセプト。

このプロセスは、index.phpファイル内で開始され、最初にリクエストオブジェクトを生成し、httpkernel :: handle()メソッドに渡します。後者は、応答オブジェクトを返す責任があります。高レベルでは、これはDrupalアプリケーションとSymfonyアプリケーション(またはhttpkernelコンポーネントを使用するその他のアプリケーション)の両方で発生します。

httpkernelとイベント

httpkernelは、Symfonyベースのアプリケーションの中核です。ご覧のとおり、そのハンドル()メソッドには、応答の準備に多くの責任があり、イベント駆動型プロセスでこれを行います。これにより、アプリケーションが非常に柔軟になり、重い作業は常にこれらのイベントのリスナーに委任されます。

前のチャートを見ると、このワークフローは、SymfonyとDrupalの点で基本的に接着剤を表す2番目の列で説明されていることがわかります。

kernel.requestという最初のイベントから始まります。このイベントの購読者は、さまざまなタスクを処理します。しかし、Drupal 8では、2つの非常に重要なタスクが形式のネゴシエーションとルーティングです。最初のものは、返される必要がある応答のタイプ(HTML、JSON、画像、PDFなど)を決定し、2番目はこの応答を処理するコードを決定します(routing.ymlファイルのルートで定義された_controllerキーは_controllerキー)。ただし、このイベントワークフローのほとんどの手順と同様に、リスナーが応答オブジェクトを返す場合、プロセスはほとんどの後続のステップ(伝播を停止)をスキップし、kernel.responseに直接移動します。

2番目のイベントはkernel.controllerです。これは、アプリケーションがどのコントローラーがリクエストの処理に責任があるかを知っている後に呼び出されます。この時点で、リスナーは引き続きオーバーライド操作を実行できます。このステップの直後に、カーネルはコントローラーに渡されたパラメーターを解析する責任があります。 Drupalでのそのような操作の1つは、リクエスト(ノードなど)にあるIDに基づいてオブジェクトをロードし、これらのオブジェクトをコントローラーに直接提供することです。その後、コントローラーは最終的に対応するパラメーターで呼び出されます。

コントローラーは、ある種の応答を返す責任があります。応答オブジェクトを返すと、プロセスはkernel.responseイベントにジャンプします。後者のリスナーは、ヘッダーまたはコンテンツ自体の変更など、オブジェクトに土壇場の変更を実行できます。また、ハンドル()メソッドから取得した後、フロントエンドコントローラーは、応答オブジェクトのsend()メソッドを使用してユーザーに送り返し、プロセスを終了します。

From Request to Response: A Journey into Drupal 8 Internals

レンダリングされた配列をより深く理解する

コントローラーが応答オブジェクトを返さない場合、カーネルは最後のイベントをトリガーします:kernel.view。そのサブスクライバーは、コントローラーの結果を実際の応答オブジェクトに変換する責任があります。したがって、これは、そのオブジェクトを正しい応答に変換するビューイベントサブスクライバーと組み合わせる限り、コントローラーからあらゆるタイプのオブジェクトを返すことができることを意味します。

ただし、例でわかるように、コントローラーはほとんどの場合、レンダリングされた配列を返します。これは通常、ページの主なコンテンツを表します(Drupal 7のページコールバックと同様)。

これを処理するために、Drupal 8には、この配列を正しい応答オブジェクトに変換する責任があるMainContentViewSubscriberがあります。これは、前述の形式交渉段階で選択された特定のMainContentrendererを使用して行います。これらのレンダラーの一部はすでに利用可能ですが、使用されるデフォルトのレンダラーはHTMLRENDERERです。

htmlrenderer

これは最も一般的に使用されるメインコンテンツレンダラータイプであるため、ページの構築方法を詳しく見てみましょう。

このプロセスのクールなことは、ページのバリエーションの概念です。これは、HTMLRENDERERが、メインコンテンツレンダリング配列をラップするために使用するページのタイプを見つける責任のあるイベントをディスパッチすることを意味します。デフォルトでは、ブロックモジュールが有効になっていない限り、SimplePageVariantが使用されます。この場合、BlockPageVariantが開始され、メインコンテンツの周りのエリアにブロックが配置されます。必要に応じて、このイベントを独自のモジュールで購読して、独自のバリエーションを提供できます。

これは、メインコンテンツアレイをラップするrenderResponse()メソッドの#Type => 'page' render Arrayを提供するhtmlrendererのprepare()メソッドで発生します。後者の2つは、#type => 'html'レンダリングアレイに包まれています。生成されたHTML文字列は応答オブジェクトに追加され、フロントエンドコントローラーに返されます。

これはプロセスの非常に高いレベルの概要ですが、これは基本的に起こったことです。これで、応答オブジェクトがあります。つまり、カーネルはkernel.responseイベントをディスパッチできます。その後、フロントエンドコントローラーは応答をユーザーに直接送り返し、プロセスを終了できます。

結論

この記事では、ユーザー要求からサーバーリターンへの応答を追跡することにより、内部的にDrupal 8(およびSymfony2)を調査しました。 Drupal 8がhttpkernelおよびhttpfoundation symfony2コンポーネントをどのように活用しているか、そしてそれが基本的にそれらのコンポーネントの上にある方法を見てきました。さらに、それらの間の接着剤がカーネルによって派遣されたイベントで構成されていることがわかります。最後に、レンダリングパイプラインの助けを借りて、HTMLページをユーザーに戻す方法を見てきました。

Drupal 8アプリケーションで舞台裏で何が起こっているのかを理解することで、このプロセスに到達する場所を正確に知ることで優れたアプリケーションを作成できると思います。この記事から1つだけを奪うだけなら、それは柔軟性という言葉であるべきだと思います。 Drupal 8で必要なものを構築する柔軟性は、Drupal 7で何よりもはるかに多いためです。それは確かに現代になりました。

Drupal 8の内部構造(FAQ)

についてのFAQ Drupal 7とDrupal 8の主な違いは何ですか?

Drupal 8は、Drupal 7と比較していくつかの大きな変化を導入します。 Twigと呼ばれる新しいテーマエンジンがあり、より安全で柔軟性があります。 Drupal 8はモバイルフレンドリーでもあり、より多くの組み込みフィールドが含まれています。言語管理と翻訳サポートが改善された多言語サイトをよりよくサポートします。さらに、Drupal 8は、Symfonyコンポーネントが広く使用されているため、サードパーティのプラットフォームとより適切に統合します。

Drupal 8リクエストと応答を処理する方法は?

Drupal 8 Symfony HTTPKernelコンポーネントを使用して、リクエストと応答を処理します。リクエストが行われると、Drupal 8はリクエストオブジェクトを作成し、httpkernelに渡します。 httpkernelはルーティングシステムを使用して、どのコントローラーがリクエストを処理するかを決定します。コントローラーはリクエストを処理し、応答オブジェクトを返します。これは、HTTPKernelがクライアントに送り返します。

Drupal 8のルーティングシステムの役割は何ですか?

Drupal 8のルーティングシステムは、URLを特定のコントローラーにマッピングする責任があります。モジュールが提供するルーティング定義を使用して、指定された要求を処理するコントローラーを決定します。ルーティングシステムは、システムの状態に応じて変更できる動的ルーティングもサポートします。

Drupal 8のテーマシステムはどのように機能しますか?

Drupal 8のテーマシステムは、柔軟で安全なテンプレートエンジンであるTwigを使用しています。 Drupal 8のトピックは、.info.ymlファイル(トピックに関するメタデータを提供)とTwigテンプレートファイル(HTML出力を定義)で構成されています。テーマシステムはテンプレートの継承もサポートしているため、テーマが他のテーマやモジュールからテンプレートを拡張および上書きすることができます。

Drupal 8でカスタムモジュールを開発するにはどうすればよいですか?

Drupal 8のカスタムモジュールの開発には、モジュールに関するメタデータを提供する.info.ymlファイルと、モジュールのPHPコードを含む.moduleファイルの作成が含まれます。モジュールには、ルーティングファイルやサービスを定義するサービスファイルを定義するファイルをルーティングするなど、他のファイルも含める場合があります。 Drupal 8は、オブジェクト指向のプログラミングとSymfonyコンポーネントを使用して、書き込みを再利用可能でテスト可能なコードを簡単にします。

Web開発にDrupal 8を使用することの利点は何ですか?

Drupal 8は、Web開発に多くの利点を提供します。 Symfonyコンポーネントを使用して、より強力で柔軟性を高めます。箱から出してレスポンシブなデザインをサポートしているため、モバイルに優しいWebサイトを簡単に作成できます。 Drupal 8は、多言語サポート、より良いSEO機能、よりユーザーフレンドリーな管理インターフェイスも改善します。

Drupal 8データベースの相互作用を処理する方法は?

Drupal 8は、データベースAPIを使用してデータベースの相互作用を処理します。データベースAPIは、SQLの上に抽象化レイヤーを提供し、開発者が基礎となるデータベースエンジンの詳細を理解せずにデータベースクエリを作成できるようにします。また、動的クエリ、トランザクション、およびスキーマ管理もサポートしています。

Drupal 8のイベントスケジューラの役割は何ですか?

Drupal 8のイベントスケジューラは、イベントとイベントリスナーの管理に使用されます。イベントが発生すると、イベントスケジューラは登録されたすべてのリスナーに通知し、アクションを実行できます。これにより、モジュールは分離された方法で相互に対話できます。

Drupal 8キャッシュを処理する方法は?

Drupal 8には、パフォーマンスの向上に役立つ複雑なキャッシュシステムがあります。データベース、ファイル、メモリベースのバックエンドなど、複数のキャッシュされたバックエンドをサポートします。 Drupal 8には、キャッシュされたデータの微調整された故障を可能にするキャッシュタグシステムもあります。

Drupal 8の機能を拡張するにはどうすればよいですか?

Drupal 8の機能は、モジュールとテーマを介して拡張できます。モジュールは新しい機能を追加したり、既存の機能を変更したり、テーマがサイトのルックアンドフィールを制御します。 Drupal 8は、機能とサービスの交換を可能にするプラグインをサポートし、システムの他の部分に注入できる再利用可能な機能を提供します。

この改訂された出力は、直接的なコピーを避けている間、文と段落をrepraseしながら維持します

以上がリクエストから応答へ:Drupal 8内部への旅の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。