Symfony2學(xué)習(xí)筆記之插件格式分析
本文講述了Symfony2的插件格式。分享給大家供大家參考,具體如下:
一個(gè)bundle類(lèi)似于其它框架中的插件,但是比插件表現(xiàn)更好。它跟其它框架最主要的不同是在Symfony2中所有東西都是bundle,包括核心框架功能和你寫(xiě)的所有應(yīng)用程序代碼。Symfony2中,bundle可是一等公民。這給了你使用其它第三方開(kāi)發(fā)的內(nèi)容包或者分發(fā)你自己的bundle更多靈活性。你可以方便的選擇哪些內(nèi)容可以應(yīng)用到你的程序中那些不用,來(lái)根據(jù)你的想法優(yōu)化它們。
一個(gè)bundle就是一個(gè)目錄,它具有很好的結(jié)構(gòu)性,它能存放從類(lèi)到controller和web資源等任何東西。
一個(gè)bundle僅僅是一個(gè)結(jié)構(gòu)化的文件目錄集合,它實(shí)現(xiàn)一個(gè)單一的內(nèi)容。
你可以創(chuàng)建一個(gè)BlogBundle,一個(gè)ForumBundle或者一個(gè)實(shí)現(xiàn)用戶(hù)管理的bundle(好像已經(jīng)有很多此類(lèi)開(kāi)源的bundle了)。每個(gè)bundle目錄包含跟實(shí)現(xiàn)內(nèi)容有關(guān)的所有東西,包括PHP文件,模板,樣式表,javascript文件,測(cè)試內(nèi)容以及其它任何相關(guān)的東西。要實(shí)現(xiàn)的內(nèi)容的各方面都保存在一個(gè)bundle中。
一個(gè)應(yīng)用程序是由在AppKernel類(lèi)中registerBundles()方法里定義的所有bundle組成。
// 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; }
在這里你可以通過(guò)該方法來(lái)統(tǒng)一控制和管理你的應(yīng)用程序組成。
一個(gè)bundle可以存放在任何目錄下,只需要能夠通過(guò)配置app/autoload.php文件中的自動(dòng)加載器即可被自動(dòng)加載。
創(chuàng)建一個(gè)bundle
Symfony2標(biāo)準(zhǔn)版中已經(jīng)為你準(zhǔn)備好了一全功能的創(chuàng)建bundle的工具文件。你可以運(yùn)行它來(lái)創(chuàng)建bundle的所有內(nèi)容,當(dāng)然你也可以
選擇自己手工創(chuàng)建。現(xiàn)在我們創(chuàng)建一個(gè)AcmeTestBundle并讓它能夠在我們的應(yīng)用程序中工作。注意,這里的Acme是一個(gè)虛假的提供商名字,你完全可以替換它為你自己組織或公司的名字。
首先,創(chuàng)建一個(gè)src/Acme/TestBundle/ 目錄并添加新文件AcmeTestBundle.php
// src/Acme/TestBundle/AcmeTestBundle.php namespace Acme\TestBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class AcmeTestBundle extends Bundle { }
接下來(lái),讓它在你的應(yīng)用程序可用,則需要在AppKernel類(lèi)中的registerBundles()方法中添加它。
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... // register your bundles new Acme\TestBundle\AcmeTestBundle(), ); // ... return $bundles; }
雖然現(xiàn)在它不能做任何事情,但是它已經(jīng)成為你應(yīng)用程序的一部分了。
我們同樣可以使用Symfony2為我們提供給命令行工具來(lái)創(chuàng)建:
$ php app/console generate:bundle --namespace=Acme/TestBundle
如果你使用上面的命令行工具,則創(chuàng)建的bundle會(huì)自動(dòng)的注冊(cè)到appKernel類(lèi)中。
Bundle的目錄結(jié)構(gòu)
看一下我們Symfony2自帶的Demo bundle的目錄結(jié)構(gòu):
bundle的目錄機(jī)構(gòu)簡(jiǎn)單靈活,從上面的截圖中可以看到:
Controller/ 包含bundle的所有controllers文件,比如HelloController.php 。
DependencyInjection/ 保存了特定的依賴(lài)注入擴(kuò)展類(lèi),該類(lèi)可能會(huì)導(dǎo)入服務(wù)配置,注冊(cè)編譯器傳輸或者更多其它。該目錄并不是必需的。
Resources/config/ 存放著配置文件,包括路由配置(比如:routing.yml)。
Resources/views/ 所有的模板被按照對(duì)應(yīng)controller的名字分成文件夾保存在這里。比如Hello/index.html.twig 。
Resources/public/ 所有可訪(fǎng)問(wèn)的web資源(圖片,樣式表等)和通過(guò)assets:install控制臺(tái)命令拷貝或者異步鏈接到項(xiàng)目 web/ 目錄的內(nèi)容。
Tests/ 保存bundle所有的測(cè)試
下面是Symfony2 推薦的一些有關(guān)bundle的標(biāo)準(zhǔn)規(guī)則:
Bundle名稱(chēng):
一個(gè)bundle同時(shí)也是一個(gè)PHP的命名空間。命名空間必須遵守PHP5.3命名空間和類(lèi)名的內(nèi)部技術(shù)標(biāo)準(zhǔn)。開(kāi)頭使用提供商名,接著是分類(lèi)段(可以省略),最后是命名空間的簡(jiǎn)寫(xiě)名字,而且該名字必須以Bundle作為后綴。一個(gè)命名空間變?yōu)橐粋€(gè)bundle只需要你在該命名空間內(nèi)添加一個(gè)bundle類(lèi)即可。
Bundle類(lèi)的命名:
僅適用數(shù)字,字母和下劃線(xiàn)
使用駝峰式命名
使用描述性簡(jiǎn)潔的名字(不超過(guò)兩個(gè)單詞)
使用供應(yīng)商名稱(chēng)做前綴(可選的分類(lèi)命名空間)
添加Bundle作為名稱(chēng)后綴
比如:
Namespace => Bundle 類(lèi)名稱(chēng)
Acme\Bundle\BlogBundle => AcmeBlogBundle Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle Acme\BlogBundle => AcmeBlogBundle
定義bundle類(lèi)時(shí)的getName()方法應(yīng)該返回類(lèi)名稱(chēng)。
每個(gè)bundle都有一個(gè)別名,它是小寫(xiě)字符簡(jiǎn)寫(xiě)版的bundle名,使用下劃線(xiàn)分割。比如 acme_hello 的bundle原名是AcmeHelloBundle, acme_social_blog 則是Acme\Social\BlogBundle的實(shí)例。
別名在一個(gè)bundle中必須是唯一的。
Bundle的目錄結(jié)構(gòu):HelloBundle的基礎(chǔ)目錄結(jié)構(gòu)
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說(shuō)明的根目錄文件。
使用類(lèi)的子文件夾的深度應(yīng)該保持到最?。?級(jí)是極限)。如果更多級(jí)可以定義為非靜態(tài),不過(guò)很少使用。bundle的目錄是只讀的。如果你需要修改臨時(shí)文件,把它們保存到主應(yīng)用程序的cache/ 或者 log/ 目錄下。
需要強(qiáng)調(diào)的類(lèi)和文件
類(lèi)型 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/
類(lèi):
bundle的目錄結(jié)構(gòu)是被用來(lái)當(dāng)作命名空間層級(jí)的。比如HelloController類(lèi)保存在 Bundle/HelloBundle/Controller/HelloController.php文件中。
所以類(lèi)的完全限定名是 Bundle\HelloBundle\Controller\HelloController 。 一些類(lèi)被看作是裝飾,應(yīng)該越短越好,比如Commands,Helpers, Listeners 和Controllers等,一般都會(huì)被當(dāng)作后綴。
跟事件分發(fā)器有關(guān)的類(lèi)應(yīng)該用后綴Listener標(biāo)識(shí)。
異常類(lèi)應(yīng)該保存到一個(gè)Exception子命名空間中。
關(guān)于提供商
一個(gè)bundle不應(yīng)該被嵌入第三方的PHP類(lèi)庫(kù),它應(yīng)該依靠Symfony2標(biāo)準(zhǔn)來(lái)自動(dòng)加載它們。
一個(gè)bundle不應(yīng)該被嵌入第三方的javascript,CSS或者其它語(yǔ)言寫(xiě)的任何類(lèi)庫(kù)。
關(guān)于測(cè)試
一個(gè)bundle應(yīng)該有一個(gè)使用PHPUnit的測(cè)試單元并把它存儲(chǔ)在Tests/ 目錄下。
測(cè)試應(yīng)該遵循以下原則:
測(cè)試套件必須能夠被一個(gè)簡(jiǎn)單的phpunit 命令從一個(gè)簡(jiǎn)單的應(yīng)用程序中執(zhí)行。
功能測(cè)試應(yīng)該只備用來(lái)測(cè)試回復(fù)輸出和一些監(jiān)控信息。
測(cè)試代碼覆蓋應(yīng)該至少在95%以上的基本代碼。
一個(gè)測(cè)試套件可以不包含AllTests.php腳本,但必須依靠外部的phpunit.xml.dist文件。
文檔說(shuō)明
所有的類(lèi)必須帶有PHPDoc。
Controllers
最好的情況下,controller應(yīng)該在一個(gè)可以部署到其它地方的bundle中,那么它不能繼承Controller基類(lèi)。而是通過(guò)實(shí)現(xiàn)ContainerAwareInterface接口或者繼承ContainerAware來(lái)取代繼承Controller。
Routing
如果bundle提供路由,他們必須使用bundle的別名為前綴,比如一個(gè)AcmeBlogBundle實(shí)例,所有的路由名必須是acme_blog_ 開(kāi)頭。
Templates
如果bundle提供模板,它必須使用Twig。 bundle不必低通一個(gè)主布局文件,如果你的bundle是一個(gè)完整的應(yīng)用程序除外。
翻譯文件
如果bundle提供信息翻譯,它必須是被定義成XLIFF格式,區(qū)域名必須被命名在bundle名字之后,如bundle.hello
配置
為了提供更大的靈活性,一個(gè)bundle可以使用Symfony2的內(nèi)建機(jī)制提供配置設(shè)置。對(duì)于簡(jiǎn)單的設(shè)置,依賴(lài)于默認(rèn)的Symfony2的parameters配置入口。 Symfony2參數(shù)都是簡(jiǎn)單的 key/value 對(duì)。值可以是任意的合法的PHP值。 每個(gè)參數(shù)名應(yīng)該以訛bundle的別名開(kāi)始,這只是一個(gè)最佳的建議。參數(shù)名其余部分用點(diǎn)號(hào)(.)分割,比如 acme_hello.email.from
讓最終用戶(hù)可以在配置文件中直接提供值信息。
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');
如果你定義服務(wù),我們也推薦你使用bundle的別名作為前綴。
總結(jié)思考:
以上是關(guān)于Symfony2中最主要的插件格式bundle的大體情況,在整個(gè)Symfony2為基礎(chǔ)開(kāi)發(fā)的應(yīng)用程序中,幾乎全部都是有bundle組成。Symfony2本身的核心組件都是FrameworkBundle。在Symfony2交流社區(qū)中,已經(jīng)有了大量的開(kāi)發(fā)者貢獻(xiàn)了他們的bundle,我們可以直接拿來(lái)集成到我們自己的應(yīng)用程序中使用。上面所說(shuō)的大部分規(guī)則,都是應(yīng)用于你開(kāi)發(fā)貢獻(xiàn)bundle時(shí)應(yīng)該遵循的統(tǒng)一規(guī)則,以方便其它用戶(hù)使用。
帶有第三方貢獻(xiàn)的bundle的Symfony2開(kāi)發(fā)包:
如果你不打算把你的bundle貢獻(xiàn)出來(lái),那么完全可以不用按照這里說(shuō)的大部分規(guī)則進(jìn)行開(kāi)發(fā)。
希望本文所述對(duì)大家基于Symfony框架的PHP程序設(shè)計(jì)有所幫助。
- Symfony2聯(lián)合查詢(xún)實(shí)現(xiàn)方法
- Symfony2創(chuàng)建頁(yè)面實(shí)例詳解
- symfony2.4的twig中date用法分析
- Symfony2之session與cookie用法小結(jié)
- Symfony2實(shí)現(xiàn)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的方法小結(jié)
- Symfony2框架學(xué)習(xí)筆記之表單用法詳解
- Symfony2學(xué)習(xí)筆記之系統(tǒng)路由詳解
- Symfony2學(xué)習(xí)筆記之控制器用法詳解
- Symfony2學(xué)習(xí)筆記之模板用法詳解
- Symfony2安裝第三方Bundles實(shí)例詳解
- Symfony2函數(shù)用法實(shí)例分析
相關(guān)文章
laravel 5.1下php artisan migrate的使用注意事項(xiàng)總結(jié)
這篇文章主要給大家總結(jié)介紹了在laravel 5.1下php artisan migrate的使用注意事項(xiàng),文中介紹的非常詳細(xì),對(duì)大家使用php artisan migrate具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長(zhǎng)實(shí)例
這篇文章主要介紹了PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長(zhǎng)實(shí)例,需要的朋友可以參考下2014-05-05PHP解密支付寶小程序的加密數(shù)據(jù)、手機(jī)號(hào)的示例代碼
這篇文章主要介紹了PHP解密支付寶小程序的加密數(shù)據(jù)、手機(jī)號(hào)的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02yii2.0框架實(shí)現(xiàn)上傳excel文件后導(dǎo)入到數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了yii2.0框架實(shí)現(xiàn)上傳excel文件后導(dǎo)入到數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了yii2.0上傳excel文件后導(dǎo)入到數(shù)據(jù)庫(kù)的相關(guān)模型、視圖、控制器實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-04-04ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法
這篇文章主要介紹了ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了thinkPHP框架中Memcached緩存的設(shè)置與使用相關(guān)操作技巧,需要的朋友可以參考下2018-03-03php生成隨機(jī)密碼自定義函數(shù)代碼(簡(jiǎn)單快速)
創(chuàng)建大量用戶(hù)時(shí)一個(gè)一個(gè)想密碼是讓人頭疼的事,使用php隨機(jī)生成一個(gè)安全可靠的密碼,又方便又快捷,可以添加自己想的字符串,可以用在FTP密碼、Mysql密碼、網(wǎng)站后臺(tái)密碼等地方2014-05-05