アプリケーションの
src/vendor/symfony/src/Symfony
ディレクトリに移動すると、3つのディレクトリが表示されます。
- 構成部品
- 基礎
- 枠組み
最初の部分では、フレームワーク自体は、
Framework
ディレクトリを調べることで簡単に確認できる「バンドル」のセットであると書きました。
-
Framework/DoctrineBundle
:これはDoctrine ORMです -
Framework/ProfilerBundle
:これは開発者の友人です-ツールバー -
Framework/SwiftmailerBundle
:Swiftメーラー -
Framework/WebBundle
:Web、テンプレート、ユーザー -
Framework/ZendBundle
:Zendライブラリ、現在Zend_Logを使用
WebBundleは、おそらく現在利用可能な最大の「バンドル」です。 ここに、アプリケーションコントローラーの継承元のコントローラー、ユーザークラスとセッション、アプリケーションとバンドルのテンプレートとユーティリティとスケルトンがあります。 一般的に、それを調べることは興味深いですが、今回はそうではありません。
Foundation
コンテンツは、コアコードライブラリに類似しています。 これには、この奇跡が本来どおりに機能するようにするコードが含まれています。 特に、カーネルの基本クラス、カーネルの「バンドル」、EventDispatcher、ユニバーサルクラスオートローダー、すべてのバンドルがトレースされないBundleInterfaceインターフェイスを実装する抽象Bundleクラス。
Components
の内容はまさにコンポーネントですが、PHP 5.3のスタイルで記述されています。 現在利用可能:
- コンポーネント/コンソール
- DependencyInjectionContainer
- イベントディスパッチャ
- OutputEscaper
- RequestHandler
- ルーティング
- テンプレート作成
- ヤムル
要するに、フロントコントローラー
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の簡単な概要は終了しました。 もちろん、フレームワークは未処理のままであり、状況によっては予期しないエラーが発生する場合がありますが、そうでない場合もあります。 しかし、フレームワークの開発者は、あなたの希望、意見、そしてもちろんバグ報告も試して表現することをお勧めします。 ようこそ!
さて、Symfony /コンポーネントについて簡単なレビューをしようと思います。