Symfony 2は現在開発中であり、本番環境で使用する準備ができていません。 しかし、勉強するために試すことはすでに可能です。 フレームワークに基づくアプリケーションのレビューから知り合いを始めたいと思います。 githubの Symfony 2ソース。 githubには、Symfony 2.0で構築された既製のサンドボックスアプリケーションがありますが、Symfonyのバージョンは前回とは多少異なります。 したがって、サンドボックスのソースを受け取った後、私が最初にしたことは、
src/vendor/symfony
のSymfonyのバージョンを最新のものに置き換えることでした。
git clone git://github.com/symfony/symfony-sandbox.git sandbox cd sandbox / src /ベンダー rm -rf symfony git clone git://github.com/symfony/symfony symfony
したがって、最初に目を引くのは、アプリケーションのディレクトリ構造がまったく異なることです。 つまり、hello、src、webの3つのディレクトリがあります。
-
hello/
:アプリケーションにちなんで名付けられ、設定ファイルを含むディレクトリ。 -
src/
:すべてのPHPコードはここに保存されます。 -
web/
:Webサーバーのルートディレクトリ。
Webサーバーのルートディレクトリには、画像、スタイルシート、javascriptなど、Webから利用可能なすべてのファイルが含まれています。 また、本番環境用のフロントコントローラー
index.php
および開発環境用の
index_dev.php
もあります。 一般に、すべてが以前と同じですが、1つの例外を除き、Symfony 2.0システム要件への準拠について環境をチェックできる便利な
check.php
スクリプトがここに表示されます。
フロントコントローラーは、アプリケーションのコアクラスを接続し、クラスのインスタンスを作成し、環境を定義し、
run
メソッドを呼び出してアプリケーションを起動します。
hello/
applicationディレクトリには、抽象クラス
Symfony\Foundation\Kernel
を拡張し、基本的な定義を生成するアプリケーションコアクラスが含まれています。 特に、アプリケーションのルートディレクトリが定義され、「バンドル」が記録されます(これがSymfonyとその上に構築されたアプリケーションの現在の構成です)。「バンドル」を検索するパスが記録され、依存関係注入コンテナーが作成され、ルーティングルールが登録されます。 IOCコンテナを作成し、実装でルーティングルールをデフォルトで定義するメソッドは、
hello/
applicationディレクトリから構成ファイルをロードします。 ここで、カーネルクラスでは、2つの重要なファイルが接続されています:
src/autoload.php
および
src/vendor/symfony/src/Symfony/Foundation/bootstrap.php
カーネルが正常に動作するために必要です。特に、クラス
Symfony\Foundation\UnversalClassLoader
インスタンスが
Symfony\Foundation\UnversalClassLoader
クラスファイルを自動ロードするためのカスタマイズ可能なパス。 パスは、2つのメソッド
registerNamespaces
によって設定されます-名前空間(名前空間)と
registerPrefixes
でクラスを検索するためのパスを指定できます
Swift_
、
Zend_
などのクラスプレフィックスでファイルを検索する方法を指定できます 5.3以下のPHPバージョンのスタイルで記述されたクラスの場合
同じディレクトリに
hello/console
ファイルがあります-Symfony 1.xの
symfony
ファイルの類似物、つまり コンソールからさまざまなコマンドを実行できるツール。
ディレクトリは次のとおりです。
-
hello/cache
:キャッシュ用 -
hello/logs
:ログ用 -
hello/config
:設定ファイル用
src/
ソースコードディレクトリには、既に説明した
src/autoload.php
とディレクトリが含まれてい
src/autoload.php
。
-
src/Application
:Webアプリケーションの「バンドル」、この場合はHelloBundleが含まれます -
src/Bundle
:サードパーティの「バンドル」が含まれているか、複数のアプリケーション間で共有されています。この場合は何もありません -
src/vendor
:サードパーティライブラリのソースコードが含まれています。この例では、doctrine
、swiftmailer
、symfony
、zend
が含まれています
HelloBundleに含まれるもの:
- BundleバンドルクラスはSymfony \ Foundation \ Bundle \ Bundleクラスの拡張であり、Symfony \ Foundation \ Bundle \ BundleInterfaceインターフェイスを実装します
-
HelloBundle/Controller/HelloController.php
:アプリケーションコントローラー -
HelloBundle/Resources
:テンプレートを含むバンドルリソース
重要なポイント-フレームワークはディレクトリの構造を決定せず、制限を課しません。 アプリケーションのカーネルクラスを見ると、すべてのパスがそこに書き込まれていることがわかります。 そして、私たちの裁量でそれらを変更することができます。 このディレクトリ構造は、サンドボックスアプリケーションによって正確に提案されたものであり、今後デフォルトとして提供される可能性があります。
アプリケーションのディレクトリ構造を調べた後、約束された柔軟性がどこに隠されているか、そして何が正確に変更できるかを見つけることができます。 正直なところ、ディレクトリ構造自体は、私たちの裁量で変更できる最初のものです。 Symfony 1.xには、一般的なコードを使用するさまざまなアプリケーションを含む
apps/
ディレクトリがありました。 私たちの場合、このディレクトリは作成されていませんが、異なるアプリケーションを作成でき、私たちにとって便利な方法で作成できます。 たとえば、
src/
および
web/
と同じレベルにアプリケーションディレクトリを作成できます。 このケースでは、
hello
アプリケーションで行われます。 別のアプリケーション、たとえば
bye
追加できます。 または、アプリケーションのルートディレクトリを作成して、新しい
ByeKernel
アプリケーションのクラスを
hello/
ディレクトリに追加するだけです。 ところで、誰も
apps/
するための
apps/
ディレクトリの作成を禁止していません。 一般に、ディレクトリ構造に関しては、すべてが非常に柔軟です。
次に興味深い場所はバンドルです。 「バンドル」はSymfonyの「一流の市民」であり、特定の機能を実装し、他のアプリケーションの他の開発者が簡単に使用できる構造化されたファイルのセットです。 前述したように、これらはSymfony 1.xのプラグインとまったく同じではありません。 私が自分で見つけた最も近い例えは、Djangoの「アプリケーション」です。 Symfony 2では、すべてが「バンドル」で構成され、フレームワーク自体は「バンドル」のセットです。開発中のアプリケーションも「バンドル」または「バンドル」のセットです。 これにより、アプリケーションを柔軟に構成し、「バンドル」にパッケージ化された機能を接続できます。また、「バンドル」にパッケージ化してコードを配布することもできます。
たとえば、GitHubから取得したサンドボックスアプリケーションでは、カーネルクラスを見ると、使用されている「バンドル」を確認できます。これは次のようになります。
-
Symfony\Foundation\Bundle\KernelBundle
-
Symfony\Framework\WebBundle\Bundle
-
Symfony\Framework\ZendBundle\Bundle
-
Symfony\Framework\SwiftmailerBundle\Bundle
-
Symfony\Framework\DoctrineBundle\Bundle
-
Application\HelloBundle\Bundle
すべてのアプリケーションがHelloを出力し、パラメーターで渡された名前を印刷するという事実に基づいて、DoctrineBundle、SwiftmailerBundleを安全に無効にできます。
各「バンドル」は、構成ファイルを使用してカスタマイズできます。 アプリケーション構成は、
hello/config/
ディレクトリーにあります。 特に、次のものがあります。
-
hello/config/config.yml
:一般設定 -
hello/config/config_dev.yml
:hello/config/config_dev.yml
環境の設定 -
hello/config/config_prod.yml
:prod環境の設定 -
hello/config/routing.yml
:ルーティングルール
興味深いことに、
config_dev.yml
ファイルと
config_prod.yml
ファイルに
config_dev.yml
config.yml
importsステートメント
config.yml
config_prod.yml
ファイルが
config_dev.yml
非常に便利です。
config.yml
ファイルを開くと、プラグインの「バンドル」の設定があります。
#hello / config / config.yml kernel.config:〜 web.web:〜 web.templating:〜
kernel.config
などの各エントリは、バンドルの設定を定義します。 一部のバンドルには、
WebBundle
、
web.web
と
web.templating
2つのオカレンスがある複数のオカレンスがある場合があり
web.templating
環境ごとに、たとえば
config_dev.yml
で行われるように、「バンドル」設定をオーバーライドできます。
#hello / config / config_dev.yml 輸入: -{リソース:config.yml} web.debug: 例外:%kernel.debug% ツールバー:%kernel.debug% zend.logger: 優先度:情報 パス:%kernel.root_dir%/ logs /%kernel.environment%.log
したがって、アプリケーションのレビューをまとめると、次の興味深い点を強調できます。 このフレームワークは、プラグイン「バンドル」を備えたマイクロカーネルのアイデアに基づいています。 これはすべて、依存性注入コンテナを使用してバインドします。 その結果、YamlまたはXML設定ファイルを使用してカスタマイズできる「バンドル」を接続/切断することで、アプリケーションの機能を追加/削除できます。 「バンドル」を無効化または置換することにより、フレームワーク自体の一部を無効化または置換できます。
これで、フレームワーク自体の内容を簡単に理解できます。これについては、 次のパートで説明します。