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 /コンポーネントについて簡単なレビューをしようと思います。

Source: https://habr.com/ru/post/J89157/


All Articles