ホームページ >バックエンド開発 >PHPチュートリアル >Symfony2プラグイン形式の詳細説明
この記事では主に Symfony2 のプラグイン形式を紹介し、Symfony2 のプラグイン原理とプラグインの作成と使用に関する関連テクニックを詳細に分析します。困っている友達が参考になれば幸いです。
バンドルは他のフレームワークのプラグインに似ていますが、プラグインよりもパフォーマンスが優れています。他のフレームワークとの主な違いは、Symfony2 のコア フレームワーク関数と作成したすべてのアプリケーション コードを含むすべてがバンドルであることです。 Symfony2 では、バンドルは第一級市民です。これにより、他のサードパーティが開発したコンテンツ パッケージを使用したり、独自のバンドルを配布したりする柔軟性が高まります。アイデアに応じて、プログラムに何を適用し、何を最適化しないかを簡単に選択できます。
バンドルは非常に優れた構造を持ち、クラスからコントローラー、Web リソースまであらゆるものを保存できるディレクトリです。
バンドルは、単一のコンテンツを実装するファイル ディレクトリの構造化されたコレクションにすぎません。
BlogBundle、ForumBundle、またはユーザー管理を実装するバンドルを作成できます (そのようなオープンソース バンドルはすでに多数あるようです)。各バンドル ディレクトリには、PHP ファイル、テンプレート、スタイル シート、JavaScript ファイル、テスト コンテンツ、その他関連するものを含む、実装コンテンツに関連するすべてのものが含まれています。実装されるコンテンツのすべての側面がバンドルに保持されます。
アプリケーションは、AppKernel クラスの registerBundles() メソッドで定義されたすべてのバンドルで構成されます。
// app/AppKernel.php public function registerBundles() { $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Symfony\Bundle\DoctrineBundle\DoctrineBundle(), new Symfony\Bundle\AsseticBundle\AsseticBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(), ); if (in_array($this->getEnvironment(), array('dev', 'test'))) { $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); } return $bundles; }
ここでは、このメソッドを使用してアプリケーションの構成を均一に制御および管理できます。
バンドルは任意のディレクトリに保存でき、app/autoload.php ファイルでオートローダーを設定することによって自動的にロードされるだけです。
バンドルを作成する
Symfony2 標準バージョンでは、フル機能のバンドル作成ツール ファイルが用意されています。これを実行してバンドルのすべてのコンテンツを作成することも、手動で作成することも選択できます。次に、AcmeTestBundle を作成し、アプリケーションで動作させます。ここでの Acme は偽のプロバイダー名であることに注意してください。これを自分の組織または会社の名前に完全に置き換えることができます。
まず、 src/Acme/TestBundle/ ディレクトリを作成し、新しいファイル AcmeTestBundle.php を追加します
// src/Acme/TestBundle/AcmeTestBundle.php namespace Acme\TestBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class AcmeTestBundle extends Bundle { }
次に、それをアプリケーションで使用できるようにするには、AppKernel クラスの registerBundles() メソッドに追加する必要があります。
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... // register your bundles new Acme\TestBundle\AcmeTestBundle(), ); // ... return $bundles; }
今は何もできませんが、アプリケーションの一部になっています。
Symfony2 が提供するコマンド ライン ツールを使用して以下を作成することもできます。
$ php app/console generate:bundle --namespace=Acme/TestBundle
上記のコマンド ライン ツールを使用すると、作成されたバンドルは appKernel クラスに自動的に登録されます。
バンドルのディレクトリ構造Symfony2 に付属するデモ バンドルのディレクトリ構造を見てください:
上のスクリーンショットからわかるように、バンドルのディレクトリ構造はシンプルで柔軟です:
Controller/ には、HelloController.php などのバンドルのすべてのコントローラー ファイルが含まれています。
DependencyInjection/ は、サービス構成のインポート、コンパイラートランスポートの登録などを行う特定の依存関係注入拡張クラスを保持します。このディレクトリは必須ではありません。Resources/config/ には、ルーティング設定を含む設定ファイルが保存されます (例: routing.yml)。
リソース/ビュー/ すべてのテンプレートは、対応するコントローラーの名前に従ってフォルダーに分割され、ここに保存されます。たとえば、Hello/index.html.twig などです。
Resources/public/ アクセス可能なすべての Web リソース (画像、スタイル シートなど) と、assets:install コンソール コマンドを通じてプロジェクトの web/ ディレクトリにコピーまたは非同期的にリンクされたコンテンツ。
Tests/ バンドルのすべてのテストを保存します
以下は、Symfony2 によって推奨されるバンドルの標準ルールです:
バンドルは PHP 名前空間でもあります。名前空間は、名前空間とクラス名に関する PHP5.3 の内部技術標準に準拠する必要があります。先頭にプロバイダー名を使用し、その後に分類セグメント (省略可能)、最後に名前空間の短縮名を使用します。名前の末尾には Bundle を付ける必要があります。ネームスペースをバンドルにするには、バンドル クラスをネームスペースに追加するだけです。
バンドルクラスの名前付け:数字、文字、アンダースコアのみが適用可能
キャメルケースの名前付けを使用説明的で簡潔な名前を使用(2語以内)
サプライヤー名をプレフィックスとして使用(オプションのカテゴリの名前付け) スペース)
例:
Namespace => バンドルクラス名Acme\Bundle\BlogBundle => AcmeBlogBundle
Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle
Acme\BlogBundle => AcmeBlogBundle
バンドルクラスを定義するときの getName() メソッドはクラス名を返す必要があります。
各バンドルにはエイリアスがあります。エイリアスは、バンドル名の短縮版を小文字でアンダースコアで区切ったものです。たとえば、acme_hello のバンドルの元の名前は AcmeHelloBundle で、acme_social_blog は AcmeSocialBlogBundle のインスタンスです。
エイリアスはバンドル内で一意である必要があります。Bundle ディレクトリ構造: HelloBundle の基本ディレクトリ構造
XXX/... HelloBundle/ HelloBundle.php Controller/ Resources/ meta/ LICENSE config/ doc/ index.rst translations/ views/ public/ Tests/
上面的XXX/... 映射到该bundle的命名空间。其中下面的文件是必备的:
HelloBundle.php;
Resources/meta/LICENSE: 全文的许可代码;
Resources/doc/index.rst: bundle说明的根目录文件。
使用类的子文件夹的深度应该保持到最小(2级是极限)。如果更多级可以定义为非静态,不过很少使用。bundle的目录是只读的。如果你需要修改临时文件,把它们保存到主应用程序的cache/ 或者 log/ 目录下。
需要强调的类和文件
类型 VS 目录
Commands VS Command/
Controllers VS Controller/
Service Container Extensions VS /DependencyInjection/
Event Listeners VS EventListener/
Configuration VS Resources/config
Web Resources VS Resources/public
Translation files VS Resources/translations/
Templates VS Resources/views
Unit and Functional Test VS Tests/
类:
bundle的目录结构是被用来当作命名空间层级的。比如HelloController类保存在 Bundle/HelloBundle/Controller/HelloController.php文件中。
所以类的完全限定名是 Bundle\HelloBundle\Controller\HelloController 。 一些类被看作是装饰,应该越短越好,比如Commands,Helpers, Listeners 和Controllers等,一般都会被当作后缀。
跟事件分发器有关的类应该用后缀Listener标识。
异常类应该保存到一个Exception子命名空间中。
关于提供商
一个bundle不应该被嵌入第三方的PHP类库,它应该依靠Symfony2标准来自动加载它们。
一个bundle不应该被嵌入第三方的javascript,CSS或者其它语言写的任何类库。
关于测试
一个bundle应该有一个使用PHPUnit的测试单元并把它存储在Tests/ 目录下。
测试应该遵循以下原则:
测试套件必须能够被一个简单的phpunit 命令从一个简单的应用程序中执行。
功能测试应该只备用来测试回复输出和一些监控信息。
测试代码覆盖应该至少在95%以上的基本代码。
一个测试套件可以不包含AllTests.php脚本,但必须依靠外部的phpunit.xml.dist文件。
文档说明
所有的类必须带有PHPDoc。
Controllers
最好的情况下,controller应该在一个可以部署到其它地方的bundle中,那么它不能继承Controller基类。而是通过实现ContainerAwareInterface接口或者继承ContainerAware来取代继承Controller。
Routing
如果bundle提供路由,他们必须使用bundle的别名为前缀,比如一个AcmeBlogBundle实例,所有的路由名必须是acme_blog_ 开头。
Templates
如果bundle提供模板,它必须使用Twig。 bundle不必低通一个主布局文件,如果你的bundle是一个完整的应用程序除外。
翻译文件
如果bundle提供信息翻译,它必须是被定义成XLIFF格式,区域名必须被命名在bundle名字之后,如bundle.hello
配置
为了提供更大的灵活性,一个bundle可以使用Symfony2的内建机制提供配置设置。对于简单的设置,依赖于默认的Symfony2的parameters配置入口。 Symfony2参数都是简单的 key/value 对。值可以是任意的合法的PHP值。 每个参数名应该以讹bundle的别名开始,这只是一个最佳的建议。参数名其余部分用点号(.)分割,比如 acme_hello.email.from
让最终用户可以在配置文件中直接提供值信息。
YAML格式:
# app/config/config.yml parameters: acme_hello.email.from: fabien@example.com
XML格式:
<!-- app/config/config.xml --> <parameters> <parameter key="acme_hello.email.from">fabien@example.com</parameter> </parameters>
PHP代码格式:
// app/config/config.php $container->setParameter('acme_hello.email.from', 'fabien@example.com');
INI格式:
[parameters] acme_hello.email.from = fabien@example.com
这样就可以在代码中从容器获取这些配置信息了:
$container->getParameter('acme_hello.email.from');
如果你定义服务,我们也推荐你使用bundle的别名作为前缀。
总结思考:
以上是关于Symfony2中最主要的插件格式bundle的大体情况,在整个Symfony2为基础开发的应用程序中,几乎全部都是有bundle组成。Symfony2本身的核心组件都是FrameworkBundle。在Symfony2交流社区中,已经有了大量的开发者贡献了他们的bundle,我们可以直接拿来集成到我们自己的应用程序中使用。上面所说的大部分规则,都是应用于你开发贡献bundle时应该遵循的统一规则,以方便其它用户使用。
带有第三方贡献的bundle的Symfony2开发包:
如果你不打算把你的bundle贡献出来,那么完全可以不用按照这里说的大部分规则进行开发。
相关推荐:
详解Symfony在模板和行为中取得request参数的方法
以上がSymfony2プラグイン形式の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。