Symfony 2.0、RequestHandlerコンポーネント

Symfonyコンポーネントの Webサイトでは、 RequestHandlerコンポーネントについて次のように説明しています。

高速フレームワーク向けの柔軟なマイクロコア。



これで、Symfony 2のRequestHandlerとは何ですか?このトピックで検討してみます。



Symfony 2に基づくアプリケーションでリクエストを処理するプロセスを見ると、つまりSymfony\Foundation\Kernel



クラスのrun()



メソッドを検討すると、キャッシュに作成して保存するか、キャッシュDIコンテナからロードした後、リクエストハンドラオブジェクトがコンテナから受信されることがわかりますまた、DIコンテナからも取得される方法で、リクエストオブジェクトが渡されるパラメータでそのhandle()



メソッドを呼び出します。 このメソッドは、応答をsend()



するsend()



メソッドが呼び出される応答オブジェクトを返す必要がありsend()



。 一般に、リクエストの処理の最初の打撃はRequestHandlerによって行われ、応答オブジェクトも返すため、Symfony 2に含まれるコンポーネントのレビューを開始することにしました。



まず、 Symfony/Foundation/Resources/services.xml



てください。これは、RequestHandlerServiceサービスの説明がDIコンテナーで発生する場所だからです。



 <parameter key = "request_handler.class"> Symfony \ Components \ RequestHandler \ RequestHandler </ parameter>
 <parameter key = "request.class"> Symfony \ components \ RequestHandler \ Response </ parameter>
 ...
 <service id = "request_handler" class = "%request_handler.class%">
   <argument type = "service" id = "event_dispatcher" />
 </ service>
 <service id = "request" class = "%request.class%" />


この説明から、リクエストオブジェクトは単にnew Request()



、およびnew RequestHandler($dispatcher)



ようnew RequestHandler($dispatcher)



リクエストハンドラオブジェクトによって作成されることが明らかになります。ここで、 $dispatcher



イベントディスパッチャであるEventDispatcherクラスのオブジェクトです。



Symfony / Components / RequestHandlerを見ると、次のファイルのセットが表示されます。



まあ、一般的に、すべてはほとんど明白です。 クラスの内部を見なくても多くのことが明らかです。 しかし、まだすべてについて簡潔に説明します。 適切な状況が発生したときに使用される例外のクラスは、その中で行われるのはメッセージと応答コードだけです。 Request



-環境変数、パラメーター、および要求に関連するすべてを解析する要求クラス。 Response



-ブランチ本体、フォームヘッダー、および回答に関連するすべてを含む応答クラス。 RequestHandler



は要求ハンドラーです。 おそらくより詳細に検討してください。



実際、リクエストハンドラーは、パラメーターで渡されたイベントディスパッチャー(EventDispatcher)を使用してさまざまなイベントを生成し、それによって、リクエストのさまざまな段階をアプリケーションに通知し、応答を生成します。 そして、これらのイベントに対するリスナーの反応に応じて、次のイベントを終了または生成します。



要求ハンドラーが作成するイベントのリスト:



つまり、イベントは、リクエストの解析とレスポンスの生成の主要な段階を反映しています。 イベントに対するアプリケーションの反応をチェックするRequestHandler



は、引き続きイベントを作成するかシャットダウンします。 したがって、特定のイベントでハンドラーをハングさせることによるアプリケーションは、応答の形成に関与します。 ただし、アプリケーションの一部は、お互いについて何も知らない場合があります。



おそらく、これをすべて試してみてください。 これは一般的に、今から行います。 そのため、Symfonyを目的に合わせて削除し、カーネル以外のすべてを削除し、ハンドラーをcore.request



イベントにcore.request



と同時に、フレームワークの柔軟性の小さなデモを行います。



例は、Symfonyの更新バージョンを使用したサンドボックスに基づいて行われます 。環境の作成方法については、 こちらをご覧ください



それでは、設定から始めましょう。 ファイルhello/config/config.yml



で、 kernel.config: ~



以外のすべてをhello/config/config.yml



します。 ここで、アプリケーションカーネル、 hello/HelloKernel.php



ファイルを修正します



 #hello / HelloKernel.php
 //カーネルとアプリケーションを除くすべてのバンドルを削除します
パブリック関数registerBundles()
 {
  配列を返す(
    新しいSymfony \ Foundation \ Bundle \ KernelBundle()、
    新しいアプリケーション\ HelloBundle \ Bundle()、
   );
 }


ここで、DIコンテナーに必要なパラメーターとサービスを記述する必要があります。そのために、まずDIコンテナーの拡張機能を作成し、 src/Application/HelloBundle/DependencyInjection



ディレクトリーと次の内容のファイルHelloExtension.php



を作成します。



名前空間Application \ HelloBundle \ DependencyInjection;

 Symfony \ Components \ DependencyInjection \ Loader \ LoaderExtensionを使用します。
     Symfony \コンポーネント\ DependencyInjection \ Loader \ XmlFileLoader、
     Symfony \コンポーネント\ DependencyInjection \ BuilderConfiguration、
     Symfony \コンポーネント\ DependencyInjection \リファレンス、
     Symfony \ Components \ DependencyInjection \ Definition;

クラスHelloExtensionはLoaderExtensionを拡張します
 {
  パブリック関数helloLoad($ config)
   {
     $ configuration = new BuilderConfiguration();

     $ loader = new XmlFileLoader(__ DIR __。 '/ .. / Resources / config');
     $ configuration-> merge($ loader-> load( 'hello.xml'));
    
     $構成を返します。
   }

  パブリック関数getAlias()
   {
     return 'hello';
   }

  パブリック関数getNamespace()
   {
     return 'http://poulikov.ru/schema/dic/hello';
   }

  パブリック関数getXsdValidationBasePath()
   {
     return __DIR __。 '/ .. / Resources / config /';
   }
 }


拡張機能を登録します。



 #src / Application / HelloBundle / Bundle.php
 //拡張機能を使用します
 Application \ HelloBundle \ DependencyInjection \ HelloExtensionを使用します。

 ...

 //拡張機能をコンテナに登録します
パブリック関数buildContainer(ContainerInterface $ container)
 {
  ローダー:: registerExtension(新しいHelloExtension());
 }


拡張機能は、パスsrc/Application/HelloBundle/Resources/config/hello.xml



下でhello.xml



ファイルを探します。

そのため、次のようなファイルを作成する必要があります。



 <コンテナxmlns = "http://www.symfony-project.org/schema/dic/services"
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation = "http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">

   <パラメーター>
       <parameter key = "request_parser.class"> Application \ HelloBundle \ Request \ Parser </ parameter>
   </ parameters>

   <サービス>
     <service id = "request_parser" class = "%request_parser.class%">
         <注釈名= "kernel.listener"イベント= "core.request"メソッド= "resolve" />
         <argument type = "service" id = "service_container" />
     </ service>
   </ services>
 </ container>


このファイルでは、 core.request



イベントをリッスンするときにハングするサービスを定義しました

次に、リクエストパーサーを作成します。



 #src / Application / HelloBundle / Request / Parser.php

名前空間Application \ HelloBundle \ Request;

 Symfony \ Components \ DependencyInjection \ ContainerInterfaceを使用します。
 Symfony \ Components \ EventDispatcher \ Eventを使用します。
 Symfony \ Components \ Routing \ RouterInterfaceを使用します。

クラスパーサー
 {
  保護された$コンテナ。

  パブリック関数__construct(ContainerInterface $ container)
   {
     $ this-> container = $ container;
   }

  パブリック関数レジスタ()
   {
     $ this-> container-> getEventDispatcherService()-> connect( 'core.request'、array($ this、 'resolve'));
   }

  パブリック関数解決(イベント$イベント)
   {
     $ response = $ this-> container-> getResponseService();
     $ response-> setContent( "<div> Hello、World!I'm Symfony 2.0 lite </ div>");

     $ event-> setReturnValue($ response);
     $ event-> setProcessed(true);
   }
 }


最後のhello/config/config.yml



として、 hello/config/config.yml



、行hello.hello: ~



追加しhello.hello: ~





以上です! ここで、任意のアドレスに連絡すると、答えが得られます。

結果

完全に役に立たないアプリケーションが判明しました。 しかし、この例ではどのように機能するかを簡単に示すことができ、他のイベントに接続できます。 すべてが非常に柔軟で便利です。



All Articles