《PHP實戰:Symfony2學習筆記之插件格式分析》要點:
本文介紹了PHP實戰:Symfony2學習筆記之插件格式分析,希望對您有用。如果有疑問,可以聯系我們。
本文講述了Symfony2的插件格式.分享給大家供大家參考,具體如下:PHP學習
一個bundle類似于其它框架中的插件,但是比插件表現更好.它跟其它框架最主要的不同是在Symfony2中所有東西都是bundle,包括核心框架功能和你寫的所有應用程序代碼.Symfony2中,bundle可是一等公民.這給了你使用其它第三方開發的內容包或者分發你自己的bundle更多靈活性.你可以方便的選擇哪些內容可以應用到你的程序中那些不用,來根據你的想法優化它們.PHP學習
一個bundle就是一個目錄,它具有很好的結構性,它能存放從類到controller和web資源等任何東西.PHP學習
一個bundle僅僅是一個結構化的文件目錄集合,它實現一個單一的內容.PHP學習
你可以創建一個BlogBundle,一個ForumBundle或者一個實現用戶管理的bundle(好像已經有很多此類開源的bundle了).每個bundle目錄包含跟實現內容有關的所有東西,包括PHP文件,模板,樣式表,javascript文件,測試內容以及其它任何相關的東西.要實現的內容的各方面都保存在一個bundle中.PHP學習
一個應用程序是由在AppKernel類中registerBundles()辦法里定義的所有bundle組成.PHP學習
// 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; }
在這里你可以通過該辦法來統一控制和管理你的應用程序組成.PHP學習
一個bundle可以存放在任何目錄下,只需要能夠通過配置app/autoload.php文件中的自動加載器即可被自動加載.PHP學習
創建一個bundlePHP學習
Symfony2標準版中已經為你準備好了一全功能的創建bundle的工具文件.你可以運行它來創建bundle的所有內容,當然你也可以PHP學習
選擇自己手工創建.現在我們創建一個AcmeTestBundle并讓它能夠在我們的應用程序中工作.注意,這里的Acme是一個虛假的提供商名字,你完全可以替換它為你自己組織或公司的名字.PHP學習
首先,創建一個src/Acme/TestBundle/ 目錄并添加新文件AcmeTestBundle.phpPHP學習
// src/Acme/TestBundle/AcmeTestBundle.php namespace Acme\TestBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class AcmeTestBundle extends Bundle { }
接下來,讓它在你的應用程序可用,則需要在AppKernel類中的registerBundles()辦法中添加它.PHP學習
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... // register your bundles new Acme\TestBundle\AcmeTestBundle(), ); // ... return $bundles; }
雖然現在它不能做任何事情,但是它已經成為你應用程序的一部分了.PHP學習
我們同樣可以使用Symfony2為我們提供給命令行工具來創建:PHP學習
$ php app/console generate:bundle --namespace=Acme/TestBundle
如果你使用上面的命令行工具,則創建的bundle會自動的注冊到appKernel類中.PHP學習
Bundle的目錄結構PHP學習
看一下我們Symfony2自帶的Demo bundle的目錄結構:PHP學習
PHP學習
bundle的目錄機構簡單靈活,從上面的截圖中可以看到:PHP學習
Controller/ 包含bundle的所有controllers文件,比如HelloController.php .
DependencyInjection/ 保存了特定的依賴注入擴展類,該類可能會導入服務配置,注冊編譯器傳輸或者更多其它.該目錄并不是必需的.
Resources/config/ 存放著配置文件,包括路由配置(比如:routing.yml).
Resources/views/ 所有的模板被依照對應controller的名字分成文件夾保存在這里.比如Hello/index.html.twig .
Resources/public/ 所有可訪問的web資源(圖片,樣式表等)和通過assets:install控制臺命令拷貝或者異步鏈接到項目 web/ 目錄的內容.
Tests/ 保存bundle所有的測試PHP學習
下面是Symfony2 推薦的一些有關bundle的標準規則:PHP學習
Bundle名稱:PHP學習
一個bundle同時也是一個PHP的命名空間.命名空間必須遵守PHP5.3命名空間和類名的內部技術標準.開頭使用提供商名,接著是分類段(可以省略),最后是命名空間的簡寫名字,而且該名字必須以Bundle作為后綴.一個命名空間變為一個bundle只需要你在該命名空間內添加一個bundle類即可.PHP學習
Bundle類的命名:PHP學習
僅適用數字,字母和下劃線
使用駝峰式命名
使用描述性簡潔的名字(不超過兩個單詞)
使用供應商名稱做前綴(可選的分類命名空間)PHP學習
添加Bundle作為名稱后綴PHP學習
比如:PHP學習
Namespace => Bundle 類名稱PHP學習
Acme\Bundle\BlogBundle => AcmeBlogBundle Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle Acme\BlogBundle => AcmeBlogBundle
定義bundle類時的getName()辦法應該返回類名稱.PHP學習
每個bundle都有一個別名,它是小寫字符簡寫版的bundle名,使用下劃線分割.比如 acme_hello 的bundle原名是AcmeHelloBundle, acme_social_blog 則是Acme\Social\BlogBundle的實例.PHP學習
別名在一個bundle中必須是唯一的.PHP學習
Bundle的目錄結構:HelloBundle的基礎目錄結構PHP學習
XXX/... HelloBundle/ HelloBundle.php Controller/ Resources/ meta/ LICENSE config/ doc/ index.rst translations/ views/ public/ Tests/
上面的XXX/... 映射到該bundle的命名空間.其中下面的文件是必備的:PHP學習
HelloBundle.php;PHP學習
Resources/meta/LICENSE: 全文的許可代碼;
Resources/doc/index.rst: bundle說明的根目錄文件.PHP學習
使用類的子文件夾的深度應該保持到最小(2級是極限).如果更多級可以定義為非靜態,不過很少使用.bundle的目錄是只讀的.如果你需要修改臨時文件,把它們保存到主應用程序的cache/ 或者 log/ 目錄下.PHP學習
需要強調的類和文件PHP學習
類型 VS 目錄PHP學習
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/PHP學習
類:PHP學習
bundle的目錄結構是被用來當作命名空間層級的.比如HelloController類保存在 Bundle/HelloBundle/Controller/HelloController.php文件中.PHP學習
所以類的完全限定名是 Bundle\HelloBundle\Controller\HelloController . 一些類被看作是裝飾,應該越短越好,比如Commands,Helpers, Listeners 和Controllers等,一般都會被當作后綴.PHP學習
跟事件分發器有關的類應該用后綴Listener標識.PHP學習
異常類應該保存到一個Exception子命名空間中.PHP學習
關于提供商PHP學習
一個bundle不應該被嵌入第三方的PHP類庫,它應該依靠Symfony2標準來自動加載它們.PHP學習
一個bundle不應該被嵌入第三方的javascript,CSS或者其它語言寫的任何類庫.PHP學習
關于測試PHP學習
一個bundle應該有一個使用PHPUnit的測試單元并把它存儲在Tests/ 目錄下.PHP學習
測試應該遵循以下原則:PHP學習
測試套件必須能夠被一個簡單的phpunit 命令從一個簡單的應用程序中執行.PHP學習
功能測試應該只備用來測試回復輸出和一些監控信息.PHP學習
測試代碼覆蓋應該至少在95%以上的基本代碼.PHP學習
一個測試套件可以不包含AllTests.php腳本,但必須依靠外部的phpunit.xml.dist文件.PHP學習
文檔說明PHP學習
所有的類必須帶有PHPDoc.PHP學習
ControllersPHP學習
最好的情況下,controller應該在一個可以部署到其它地方的bundle中,那么它不能繼承Controller基類.而是通過實現ContainerAwareInterface接口或者繼承ContainerAware來取代繼承Controller.PHP學習
RoutingPHP學習
如果bundle提供路由,他們必須使用bundle的別名為前綴,比如一個AcmeBlogBundle實例,所有的路由名必須是acme_blog_ 開頭.PHP學習
TemplatesPHP學習
如果bundle提供模板,它必須使用Twig. bundle不必低通一個主布局文件,如果你的bundle是一個完整的應用程序除外.PHP學習
翻譯文件PHP學習
如果bundle提供信息翻譯,它必須是被定義成XLIFF格式,區域名必須被命名在bundle名字之后,如bundle.helloPHP學習
配置PHP學習
為了提供更大的靈活性,一個bundle可以使用Symfony2的內建機制提供配置設置.對于簡單的設置,依賴于默認的Symfony2的parameters配置入口. Symfony2參數都是簡單的 key/value 對.值可以是任意的合法的PHP值. 每個參數名應該以訛bundle的別名開始,這只是一個最佳的建議.參數名其余部分用點號(.)分割,比如 acme_hello.email.fromPHP學習
讓最終用戶可以在配置文件中直接提供值信息.PHP學習
YAML格式:PHP學習
# app/config/config.yml parameters: acme_hello.email.from: fabien@example.com
XML格式:PHP學習
<!-- app/config/config.xml --> <parameters> <parameter key="acme_hello.email.from">fabien@example.com</parameter> </parameters>
PHP代碼格式:PHP學習
// app/config/config.php $container->setParameter('acme_hello.email.from', 'fabien@example.com');
INI格式:PHP學習
[parameters] acme_hello.email.from = fabien@example.com
這樣就可以在代碼中從容器獲取這些配置信息了:PHP學習
$container->getParameter('acme_hello.email.from');
如果你定義服務,我們也推薦你使用bundle的別名作為前綴.PHP學習
總結思考:PHP學習
以上是關于Symfony2中最主要的插件格式bundle的大體情況,在整個Symfony2為基礎開發的應用程序中,幾乎全部都是有bundle組成.Symfony2本身的核心組件都是FrameworkBundle.在Symfony2交流社區中,已經有了大量的開發者貢獻了他們的bundle,我們可以直接拿來集成到我們自己的應用程序中使用.上面所說的大部分規則,都是應用于你開發貢獻bundle時應該遵循的統一規則,以方便其它用戶使用.PHP學習
帶有第三方貢獻的bundle的Symfony2開發包:PHP學習
PHP學習
如果你不打算把你的bundle貢獻出來,那么完全可以不用依照這里說的大部分規則進行開發.PHP學習
希望本文所述對大家基于Symfony框架的PHP程序設計有所贊助.PHP學習
歡迎參與《PHP實戰:Symfony2學習筆記之插件格式分析》討論,分享您的想法,維易PHP學院為您提供專業教程。