高速フレームワーク向けの柔軟なマイクロコア。
これで、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を見ると、次のファイルのセットが表示されます。
-
Exception/
:例外クラスのあるディレクトリ
-
ForbiddenHttpException.php
:403 Forbiddenで例外をスローする -
HttpException.php
:例外の基本クラス -
NotFoundHttpException.php
:404 Not Foundで例外をNotFoundHttpException.php
ます -
UnauthorizedHttpException.php
:401 Unauthorized例外でスローされます
-
-
Request.php
:リクエストクラス -
RequestInterface.php
:要求オブジェクトを実装するインターフェース -
Response.php
:応答クラス -
ResponseInterface.php
:応答オブジェクトを実装する必要のあるインターフェース -
RequestHandler.php
:要求ハンドラー
まあ、一般的に、すべてはほとんど明白です。 クラスの内部を見なくても多くのことが明らかです。 しかし、まだすべてについて簡潔に説明します。 適切な状況が発生したときに使用される例外のクラスは、その中で行われるのはメッセージと応答コードだけです。
Request
-環境変数、パラメーター、および要求に関連するすべてを解析する要求クラス。
Response
-ブランチ本体、フォームヘッダー、および回答に関連するすべてを含む応答クラス。
RequestHandler
は要求ハンドラーです。 おそらくより詳細に検討してください。
実際、リクエストハンドラーは、パラメーターで渡されたイベントディスパッチャー(EventDispatcher)を使用してさまざまなイベントを生成し、それによって、リクエストのさまざまな段階をアプリケーションに通知し、応答を生成します。 そして、これらのイベントに対するリスナーの反応に応じて、次のイベントを終了または生成します。
要求ハンドラーが作成するイベントのリスト:
-
core.request
-
core.load_controller
-
core.controller
-
core.view
-
core.response
-
core.exception
:例外の場合
つまり、イベントは、リクエストの解析とレスポンスの生成の主要な段階を反映しています。 イベントに対するアプリケーションの反応をチェックする
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: ~
以上です! ここで、任意のアドレスに連絡すると、答えが得られます。
完全に役に立たないアプリケーションが判明しました。 しかし、この例ではどのように機能するかを簡単に示すことができ、他のイベントに接続できます。 すべてが非常に柔軟で便利です。