關於Bundle的那些事

什麼是Bundle

  • Bundle在你的項目裏是一等公民
  • 事實上SF2自己就是一個Bundle
  • 最小程度的粘合劑 用於集成類庫/命令行工具到SF2

Bundle能幹啥喲

  • 提供控制器 example: Controller
  • 提供命令行 example: app/console command tool
  • 提供ORM實體(Entities)或者文檔(Documents)
  • 提供服務(Services)
  • 提供Assets文件(js css img)

第三方Bundles的索引: knpbundles.com (其實我更喜歡packagist.org)

自動索引相似Bundle的代碼

遵循下面的這些規則 會給bundle生成必定的分數

  • 每新增一個github的followers都有加分 (+1分)
  • README.md超過300個字也能加分 (+5分)
  • 若是使用CI持續集成也能加分 (+5分)
  • 若是travisCI上build的status都是ok的加分 (+5分)
  • 提供composer包的加分 (+5分)
  • 在KnpBundles每有一我的推薦你的bundle加分 (+5分)
  • 每一個月都最少要在github上提交一次

Knpbundles索引大全長啥樣

請輸入圖片描述

(其實packagist.org更好用:)請輸入圖片描述)php

小哥 若是你有天心血來潮要寫本身的bundle 請先上knp跟packagist看看是否是已經有了相似的bundle 有的話 請fork它 幫助它改善的更穩定更強大 這樣能節約你的時間css

Bundle開發最好的實踐 : Bundle的目錄結構

AcmeMyBundle.php
Command
    MyCommand.php
Controller
    MyController.php
Doctrine
    ORM
        Foo.php
        FooRepository.php
Model
    Foo.php
Resources
    config
    doc
    meta
    public
    views
...

參考CMF : Bundle Standards git

Bundle開發最好的實踐 : DIC 設置

  • 全部的service前綴都用Bundle的別名 (eg : AcmeMyExtension::getAlias() )
  • 任何參數都顯式處理
  • 使用compiler傳遞對其它Bundle服務的做用
DependencyInjection 
    Compiler
        MyCompilerPass.php
    Configuration.php
    AcmeMyExtension.php
use Symfony\C..\D..I..\ContainerBuilder as CB;
use Symfony\C..\Config\FileLocator;
use Symfony\C..\HttpKernel\D..I..\Extension;
use Symfony\..\D..I..\Loader\XmlFileLoader;

class AcmeMyExtension extends Extension
{
    public function load(array $configs, CB $dic)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration(
            $configuration, $configs
        );

        $dir = __DIR__ . '/../Resources/config';
        $locator = new FileLocator($dir);
        $loader = new XmlFileLoader($dic, $locator);
        $loader->load('services.xml');

        foreach ($config as $key => $val) {
            $dic->setParameter('acme_my.'.$key, $val);
        }
    }
}

Bundle開發最好的實踐 : 設置一個class

  • 合併同時驗證Bundle的設置參數
  • Sf2.1+ : app/console config:dump-reference
use Symfony\C..\Config\Definition as Def;

class Configuration implements Def\ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new Def\Builder\TreeBuilder();

        $treeBuilder->root('acme_my')
        ->children()
            ->scalarNode('host')
                ->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('port')
                ->defaultValue(2000)->end()
            ->scalarNode('timeout')
                ->defaultValue(30000)->end()
        ->end()
        ;

        return $treeBuilder;
    }
}

Bundle開發最好的實踐 : Composer包設置

  • 用packagist建立你的composer索引
  • Bundle要在packagist上註冊過
  • 肯定開啓了packagist提交鉤子
{
    "name": "acme/my-bundle",
    "type": "symfony-bundle",
    "description": "This Bundle is an example",
    "license": "MIT",
    "authors": [
        {
            "name": "Duffy Duck",
            "email": "diffy@acme.com"
        }
    ],
    "require": {
        "php":                      ">=5.3.3",
        "symfony/framework-bundle": "~2.2",
    },
    "autoload": {
        "psr-0": { "Acme\\MyBundle": "" }
    },
    "target-dir": "Acme/MyBundle"
}

Bundle開發最好的實踐 : 測試

  • JMSCommandBundle能夠生成函數式測試的kernel代碼
  • 測試

    Controller
    MyControllerTest.php
    Functional
    HomepageTest.php
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class HomepageTest extends WebTestCase
{
    public function testContents()
    {
        $client = $this->createClient();
        $crawler = $client->request('GET', '/');
        $s = $client->getResponse()->getStatusCode();
        $this->assertEquals(200, $s);

        $crawler->filter('h1:contains(Homepage)');
        $this->assertCount(1, $count);
        $crawler->filter('ul.menu_main li')
        $this->assertCount(13, $count);
    }
}

Bundle開發最好的實踐 : 持續集成 travisCI

  • 項目根目錄下建立.travis.yml文件
  • 開啓github鉤子來自動測試
  • 多個版本的PHP,類庫,數據庫的測試
  • fork這個項目以後能夠很簡單的測試
language: php

php:
    - 5.3
    - 5.4
    - 5.5

env:
  - SYMFONY_VERSION=2.2.*
  - SYMFONY_VERSION=2.3.*
  - SYMFONY_VERSION=dev-master

before_script:
  - composer require symfony/symfony:${SYMFONY_VERSION} --prefer-source
  - vendor/symfony-cmf/testing/bin/travis/phpcr_odm_doctrine_dbal.sh

script: phpunit --coverage-text
相關文章
相關標籤/搜索