真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Symfony2中插件格式的示例分析-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Symfony2中插件格式的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)黃浦,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

具體如下:

一個bundle類似于其它框架中的插件,但是比插件表現(xiàn)更好。它跟其它框架最主要的不同是在Symfony2中所有東西都是bundle,包括核心框架功能和你寫的所有應(yīng)用程序代碼。Symfony2中,bundle可是一等公民。這給了你使用其它第三方開發(fā)的內(nèi)容包或者分發(fā)你自己的bundle更多靈活性。你可以方便的選擇哪些內(nèi)容可以應(yīng)用到你的程序中那些不用,來根據(jù)你的想法優(yōu)化它們。

一個bundle就是一個目錄,它具有很好的結(jié)構(gòu)性,它能存放從類到controller和web資源等任何東西。

一個bundle僅僅是一個結(jié)構(gòu)化的文件目錄集合,它實(shí)現(xiàn)一個單一的內(nèi)容。

你可以創(chuàng)建一個BlogBundle,一個ForumBundle或者一個實(shí)現(xiàn)用戶管理的bundle(好像已經(jīng)有很多此類開源的bundle了)。每個bundle目錄包含跟實(shí)現(xiàn)內(nèi)容有關(guān)的所有東西,包括PHP文件,模板,樣式表,javascript文件,測試內(nèi)容以及其它任何相關(guān)的東西。要實(shí)現(xiàn)的內(nèi)容的各方面都保存在一個bundle中。

一個應(yīng)用程序是由在AppKernel類中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;
}

在這里你可以通過該方法來統(tǒng)一控制和管理你的應(yīng)用程序組成。

一個bundle可以存放在任何目錄下,只需要能夠通過配置app/autoload.php文件中的自動加載器即可被自動加載。

創(chuàng)建一個bundle

Symfony2標(biāo)準(zhǔn)版中已經(jīng)為你準(zhǔn)備好了一全功能的創(chuàng)建bundle的工具文件。你可以運(yùn)行它來創(chuàng)建bundle的所有內(nèi)容,當(dāng)然你也可以

選擇自己手工創(chuàng)建?,F(xiàn)在我們創(chuàng)建一個AcmeTestBundle并讓它能夠在我們的應(yīng)用程序中工作。注意,這里的Acme是一個虛假的提供商名字,你完全可以替換它為你自己組織或公司的名字。

首先,創(chuàng)建一個src/Acme/TestBundle/ 目錄并添加新文件AcmeTestBundle.php

// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeTestBundle extends Bundle
{
}

接下來,讓它在你的應(yīng)用程序可用,則需要在AppKernel類中的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為我們提供給命令行工具來創(chuàng)建:

$ php app/console generate:bundle --namespace=Acme/TestBundle

如果你使用上面的命令行工具,則創(chuàng)建的bundle會自動的注冊到appKernel類中。

Bundle的目錄結(jié)構(gòu)

看一下我們Symfony2自帶的Demo bundle的目錄結(jié)構(gòu):

Symfony2中插件格式的示例分析

bundle的目錄機(jī)構(gòu)簡單靈活,從上面的截圖中可以看到:

Controller/ 包含bundle的所有controllers文件,比如HelloController.php 。
DependencyInjection/ 保存了特定的依賴注入擴(kuò)展類,該類可能會導(dǎo)入服務(wù)配置,注冊編譯器傳輸或者更多其它。該目錄并不是必需的。
Resources/config/ 存放著配置文件,包括路由配置(比如:routing.yml)。
Resources/views/ 所有的模板被按照對應(yīng)controller的名字分成文件夾保存在這里。比如Hello/index.html.twig 。
Resources/public/ 所有可訪問的web資源(圖片,樣式表等)和通過assets:install控制臺命令拷貝或者異步鏈接到項(xiàng)目 web/ 目錄的內(nèi)容。
Tests/ 保存bundle所有的測試

下面是Symfony2 推薦的一些有關(guān)bundle的標(biāo)準(zhǔn)規(guī)則:

Bundle名稱:

一個bundle同時也是一個PHP的命名空間。命名空間必須遵守PHP5.3命名空間和類名的內(nèi)部技術(shù)標(biāo)準(zhǔn)。開頭使用提供商名,接著是分類段(可以省略),最后是命名空間的簡寫名字,而且該名字必須以Bundle作為后綴。一個命名空間變?yōu)橐粋€bundle只需要你在該命名空間內(nèi)添加一個bundle類即可。

Bundle類的命名:

僅適用數(shù)字,字母和下劃線
使用駝峰式命名
使用描述性簡潔的名字(不超過兩個單詞)
使用供應(yīng)商名稱做前綴(可選的分類命名空間)

添加Bundle作為名稱后綴

比如:

Namespace => Bundle 類名稱

Acme\Bundle\BlogBundle => AcmeBlogBundle
Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle
Acme\BlogBundle => AcmeBlogBundle

定義bundle類時的getName()方法應(yīng)該返回類名稱。

每個bundle都有一個別名,它是小寫字符簡寫版的bundle名,使用下劃線分割。比如 acme_hello 的bundle原名是AcmeHelloBundle, acme_social_blog 則是Acme\Social\BlogBundle的實(shí)例。

別名在一個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說明的根目錄文件。

使用類的子文件夾的深度應(yīng)該保持到最小(2級是極限)。如果更多級可以定義為非靜態(tài),不過很少使用。bundle的目錄是只讀的。如果你需要修改臨時文件,把它們保存到主應(yīng)用程序的cache/ 或者 log/ 目錄下。

需要強(qiáng)調(diào)的類和文件

類型 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的目錄結(jié)構(gòu)是被用來當(dāng)作命名空間層級的。比如HelloController類保存在 Bundle/HelloBundle/Controller/HelloController.php文件中。

所以類的完全限定名是 Bundle\HelloBundle\Controller\HelloController 。 一些類被看作是裝飾,應(yīng)該越短越好,比如Commands,Helpers, Listeners 和Controllers等,一般都會被當(dāng)作后綴。

跟事件分發(fā)器有關(guān)的類應(yīng)該用后綴Listener標(biāo)識。

異常類應(yīng)該保存到一個Exception子命名空間中。

關(guān)于提供商

一個bundle不應(yīng)該被嵌入第三方的PHP類庫,它應(yīng)該依靠Symfony2標(biāo)準(zhǔn)來自動加載它們。

一個bundle不應(yīng)該被嵌入第三方的javascript,CSS或者其它語言寫的任何類庫。

關(guān)于測試

一個bundle應(yīng)該有一個使用PHPUnit的測試單元并把它存儲在Tests/ 目錄下。

測試應(yīng)該遵循以下原則:

測試套件必須能夠被一個簡單的phpunit 命令從一個簡單的應(yīng)用程序中執(zhí)行。

功能測試應(yīng)該只備用來測試回復(fù)輸出和一些監(jiān)控信息。

測試代碼覆蓋應(yīng)該至少在95%以上的基本代碼。

一個測試套件可以不包含AllTests.php腳本,但必須依靠外部的phpunit.xml.dist文件。

文檔說明

所有的類必須帶有PHPDoc。

Controllers

好的情況下,controller應(yīng)該在一個可以部署到其它地方的bundle中,那么它不能繼承Controller基類。而是通過實(shí)現(xiàn)ContainerAwareInterface接口或者繼承ContainerAware來取代繼承Controller。

Routing

如果bundle提供路由,他們必須使用bundle的別名為前綴,比如一個AcmeBlogBundle實(shí)例,所有的路由名必須是acme_blog_ 開頭。

Templates

如果bundle提供模板,它必須使用Twig。 bundle不必低通一個主布局文件,如果你的bundle是一個完整的應(yīng)用程序除外。

翻譯文件

如果bundle提供信息翻譯,它必須是被定義成XLIFF格式,區(qū)域名必須被命名在bundle名字之后,如bundle.hello

配置

為了提供更大的靈活性,一個bundle可以使用Symfony2的內(nèi)建機(jī)制提供配置設(shè)置。對于簡單的設(shè)置,依賴于默認(rèn)的Symfony2的parameters配置入口。 Symfony2參數(shù)都是簡單的 key/value 對。值可以是任意的合法的PHP值。 每個參數(shù)名應(yīng)該以訛bundle的別名開始,這只是一個很好的建議。參數(shù)名其余部分用點(diǎn)號(.)分割,比如 acme_hello.email.from

讓最終用戶可以在配置文件中直接提供值信息。

YAML格式:

# app/config/config.yml
parameters:
    acme_hello.email.from: fabien@example.com

XML格式:



   fabien@example.com

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的大體情況,在整個Symfony2為基礎(chǔ)開發(fā)的應(yīng)用程序中,幾乎全部都是有bundle組成。Symfony2本身的核心組件都是FrameworkBundle。在Symfony2交流社區(qū)中,已經(jīng)有了大量的開發(fā)者貢獻(xiàn)了他們的bundle,我們可以直接拿來集成到我們自己的應(yīng)用程序中使用。上面所說的大部分規(guī)則,都是應(yīng)用于你開發(fā)貢獻(xiàn)bundle時應(yīng)該遵循的統(tǒng)一規(guī)則,以方便其它用戶使用。

帶有第三方貢獻(xiàn)的bundle的Symfony2開發(fā)包:

Symfony2中插件格式的示例分析

如果你不打算把你的bundle貢獻(xiàn)出來,那么完全可以不用按照這里說的大部分規(guī)則進(jìn)行開發(fā)。

感謝各位的閱讀!關(guān)于“Symfony2中插件格式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


本文名稱:Symfony2中插件格式的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://weahome.cn/article/cocdcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部