Symfony 2.0の概要、パート2

そのため、Symfony 2.0フレームワークの調査を続けます。 最初の部分では、Symfony 2.0に基づいて構築されたsymfony-sandboxアプリケーションのコンテンツについて説明しました。 このパートでは、フレームワーク自体の内容を調べます。



アプリケーションのsrc/vendor/symfony/src/Symfony



ディレクトリに移動すると、3つのディレクトリが表示されます。



最初の部分では、フレームワーク自体は、 Framework



ディレクトリを調べることで簡単に確認できる「バンドル」のセットであると書きました。





WebBundleは、おそらく現在利用可能な最大の「バンドル」です。 ここに、アプリケーションコントローラーの継承元のコントローラー、ユーザークラスとセッション、アプリケーションとバンドルのテンプレートとユーティリティとスケルトンがあります。 一般的に、それを調べることは興味深いですが、今回はそうではありません。



Foundation



コンテンツは、コアコードライブラリに類似しています。 これには、この奇跡が本来どおりに機能するようにするコードが含まれています。 特に、カーネルの基本クラス、カーネルの「バンドル」、EventDispatcher、ユニバーサルクラスオートローダー、すべてのバンドルがトレースされないBundleInterfaceインターフェイスを実装する抽象Bundleクラス。



Components



の内容はまさにコンポーネントですが、PHP 5.3のスタイルで記述されています。 現在利用可能:

まだ必要ではないのは、Formsサブフレームワークです。



要するに、フロントコントローラーweb/index.php



にアクセスすると、 Symfony\Foundation\Kernel



クラスを拡張するHelloKernel



というアプリケーションコアクラスのインスタンスが作成されます。 オブジェクトを作成するとき、2つのパラメーターがクラスのコンストラクターに渡されます:環境の名前とデバッグ有効フラグtrueまたはfalse。 クラスコンストラクターでは、「バンドル」の登録、「バンドル」を検索するためのパスの登録、アプリケーションのルートディレクトリの登録のメソッドが呼び出され、アプリケーション自体の名前が決定されます。 その後、 run()



メソッドがフロントコントローラーに呼び出され、そこでメインの作業が行われます。 繰り返しますが、主な作業は次のようになりboot()



。DIコンテナ(Dependency Injection Container)が初期化されるboot()



メソッドが実行され、すべての接続された「バンドル」のコンテナを構築するメソッドが初期化中に呼び出されます。 その後、アプリケーション設定の読み込みメソッドが呼び出されます。 次に、このすべての構築および形成されたコンテナは、クラスの形式でキャッシュに書き込まれます。すべてのリクエストでキャッシュを構築しないように、キャッシュからのファイルが接続され、この形成されたコンテナクラスのインスタンスが作成されます。



その後、接続されているすべての「バンドル」のboot()



メソッドが呼び出されます。 次に、リクエストオブジェクトはコンテナから引き出されます。デフォルトでは、 Symfony\Components\RequestHandler\Request



クラスのオブジェクトです。 そして、リクエストハンドラオブジェクトはコンテナから引き出されます。デフォルトでは、 handle()



メソッドを呼び出し、既に受信したリクエストオブジェクトをパラメータとして渡すSymfony\Components\RequestHandler\RequestHandler



オブジェクトです。 handle()



メソッドは、応答オブジェクトSymfony\Components\RequestHandler\Response



を返す必要があります。このオブジェクトは、応答(ヘッダーと本文)の送信を担当するsend()



メソッドを呼び出します。 さて、もし簡単かつ大まかに言えば、これはカーネルの動作を制限します。 それ以外はすべて「束」の肩にかかっています。



各「バンドル」には、2つのメソッドのみを定義するSymfony\Foundation\BundleInterface



を実装するクラスが必要です。これは、 buildContainer(ContainerInterface $container)



パラメーターとサービスbuildContainer(ContainerInterface $container)



登録するbuildContainer(ContainerInterface $container)



、「bundle」すべての「バンドル」のすべてのパラメーターとサービスがDIコンテナーで定義された後。 ほとんどの「バンドル」、つまりSymfony/Framework



すべての「バンドル」はSymfony\Foundation\Bundle



クラスを拡張し、 builderContainer



メソッドのみをオーバーラップさせて、コンテナ内の設定とサービスを決定します。



例として、 Bundle



クラスのboot()



メソッドをどのように使用できますか。 デフォルトでは、WebBundleの「バンドル」はSymfony\Components\Templating



基づいたテンプレートエンジンを使用します。 ただし、WebBundleのtemplating.engine



サービスは、Rendererクラスをコンストラクターに渡すことができないように定義されていますが、コンストラクターのSymfony\Components\Templating\Engine



は、2番目のパラメーターとしてカスタムレンダラーの配列を受け取ります。 しかし、Dependency Injection Containerのおかげで、このわずかな誤解は簡単に修正されます。 これを行うには、 Bundle



クラスのsrc/Application/HelloBundle/Bundle.php



ファイルのsrc/Application/HelloBundle/Bundle.php



、メソッドを定義します。

 public function boot(ContainerInterface $ container)
 {
   $ container-> getTemplatingService()-> setRenderer( 'name'、new Renderer());
 }


Renderer



クラスはカスタムレンダラーであり、 'name'



このレンダラーの名前です。 テンプレートを表示するときに、独自のレンダラーを使用できるようになりました。



このレビューを通して、私はコンソールからの作業にほとんど触れませんでした。 コンソールコントローラーは、Symfony 1.xのようにプロジェクトレベルではなくアプリケーションレベルで作成されるようになったことを除いて、すべてがほぼ同じままでした。 しかし、内部には大きな変更があり、追加の機能が登場しました。これらの機能については、 Components/Console



調べることでさらに学習できます。 別の興味深い機能が登場しました-Symfonyシェル。 hello/console -s



を開始するだけで十分です。インタラクティブコンソールセッションが開始されます。つまり、 Symfonyシェルでは同じコマンドを実行できます。



Symfony 2.0.0シェル



したがって、一般的に、Symfony 2.0の簡単な概要は終了しました。 もちろん、フレームワークは未処理のままであり、状況によっては予期しないエラーが発生する場合がありますが、そうでない場合もあります。 しかし、フレームワークの開発者は、あなたの希望、意見、そしてもちろんバグ報告も試して表現することをお勧めします。 ようこそ!

さて、Symfony /コンポーネントについて簡単なレビューをしようと思います。



All Articles