kjonski/how-to-bundle

一步一步的 Symfony bundle 教程

dev-master 2018-03-22 09:06 UTC

This package is auto-updated.

Last update: 2024-09-17 18:31:54 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

how-to-bundle

一步一步的教程,教你如何准备 Symfony bundle

准备仓库

以您喜欢的方式准备 bundle 仓库。您可以使用 Github 或本地仓库。请注意,仓库需要能被您未来的项目访问。
使用 Github 向导,您可以添加 README.md 和 LICENSE
Github repository wizard

克隆仓库

git clone https://github.com/kjonski/how-to-bundle.git

并用编辑器打开。

添加 composer.json 文件

{
    "name": "kjonski/how-to-bundle",
    "type": "symfony-bundle",
    "description": "Step-by-step Symfony bundle tutorial",
    "keywords": ["php", "symfony", "reusable bundle", "tutorial"],
    "license": "MIT",
    "authors": [
        {
            "name": "Karol Jonski",
            "email": "kjonski@pgs-soft.com"
        }
    ]
}

提交并推送更改。

配置项目的仓库

如果您想在现有项目中开发 bundle,并且 bundle 不在 packagist.org 上,请配置主项目的 composer.json。添加/修改 repositories 部分

"repositories": [
    {
        "type": "git",
        "url": "https://github.com/kjonski/how-to-bundle.git"
    }
],

当使用 Github 仓库时,或

"repositories": [
    {
        "type": "git",
        "url": "/path/to/how-to-bundle.git"
    }
],

当使用本地仓库时。更多详情请参阅 Composer 文档

使用 composer 安装您的 bundle

$ composer require kjonski/how-to-bundle

准备结构

b$ 代表 vendor/yourVendorName/yourBundle (例如 vendor/kjonski/how-to-bundle)目录。

b$ mkdir src
b$ mkdir tests

在您的 composer.json 中配置自动加载

"autoload": {
    "psr-4": { "Kjonski\\HowToBundle\\": "src/" }
},
"autoload-dev": {
    "psr-4": {
        "Kjonski\\HowToBundle\\Tests\\": "tests/"
    }
}

安装依赖

b$ composer require symfony/dependency-injection
b$ composer require --dev symfony/http-kernel
b$ composer require --dev phpunit/phpunit

添加 bundle 类

<?php
// src/KjonskiHowToBundle.php

namespace Kjonski\HowToBundle;


use Symfony\Component\HttpKernel\Bundle\Bundle;

class KjonskiHowToBundle extends Bundle
{

}

添加扩展类

<?php
// src/DependencyInjection/KjonskiHowToExtension.php

namespace Kjonski\HowToBundle\DependencyInjection;


use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;

class KjonskiHowToExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
    }
}

准备第一个测试

<?php
// tests/KjonskiHowToBundleTest.php


namespace Kjonski\HowToBundle\Tests;


use Kjonski\HowToBundle\DependencyInjection\KjonskiHowToExtension;
use Kjonski\HowToBundle\KjonskiHowToBundle;
use PHPUnit\Framework\TestCase;

class KjonskiHowToBundleTest extends TestCase
{
    public function testGetContainerExtension(): void
    {
        $bundle = new KjonskiHowToBundle();
        $this->assertInstanceOf(KjonskiHowToExtension::class, $bundle->getContainerExtension());
    }
}

并从 bundle 目录运行

b$ vendor/bin/phpunit tests

从现在起,您可以

$ composer remove kjonski/how-to-bundle

并且

$ composer require kjonski/how-to-bundle

您的 bundle 将会被重新安装。
请注意,您需要运行

b$ composer install

来安装您的开发依赖。

添加测试配置(tests/phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/7.0/phpunit.xsd"
         backupGlobals='false'
         backupStaticAttributes='false'
         beStrictAboutTestsThatDoNotTestAnything='true'
         bootstrap='./../vendor/autoload.php'
         colors='true'
         convertErrorsToExceptions='true'
         convertNoticesToExceptions='true'
         convertWarningsToExceptions='true'
         stopOnError='false'
         stopOnFailure='false'
         stopOnIncomplete='false'
         stopOnSkipped='false'
         verbose='true'
>
    <php>
        <ini name="error_reporting" value="-1" />
        <env name="KERNEL_CLASS" value="\Kjonski\HowToBundle\Tests\App\AppKernel" />
        <ini name='display_errors' value='1' />
        <ini name='display_startup_errors' value='1' />
        <ini name='error_reporting' value='-1' />
        <ini name='memory_limit' value='-1' />
    </php>

    <testsuites>
        <testsuite name="How To Bundle Test Suite">
            <directory>.</directory>
        </testsuite>
    </testsuites>

    <logging>
        <log type='coverage-clover' target='coverage.xml' />
        <log type='coverage-text' target='php://stdout' showOnlySummary='true' />
    </logging>

    <filter>
        <whitelist>
            <directory>../src</directory>
            <exclude>
                <directory>../vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
  • 您可以看到已经配置了 KERNEL_CLASS,因为对于某些情况,您需要为 phpunit 配置自己的 kernel
  • 请将 tests/coverage.xml 添加到忽略文件中。

现在您已准备好运行测试套件

b$ vendor/bin/phpunit -c tests/phpunit.xml

是时候使用代码质量工具了

安装

b$ composer require --dev phpstan/phpstan
b$ composer require --dev sebastian/phpcpd
b$ composer require --dev squizlabs/php_codesniffer
b$ composer require --dev friendsofphp/php-cs-fixer

添加 php-cs-fixer.config.phpphpstan.neon(可选)并运行

b$ vendor/bin/php-cs-fixer fix --config=tests/php-cs-fixer.config.php --dry-run --diff src tests
b$ vendor/bin/phpcs --report-full --standard=PSR2 src tests
b$ vendor/bin/phpstan analyse --level=4 src -c tests/phpstan.neon
b$ phpdbg -qrr vendor/bin/phpunit -c tests/phpunit.xml

构建?当然!

  • 前往 https://docs.travis-ci.cn/user/getting-started/ 并按照说明启用 Travis 构建功能,以对您的(Github)仓库进行构建。
  • 添加简单的 .travis.yml 或遵循 Symfony 持续集成
    从现在开始,每次向您的仓库推送时都会运行构建。
  • 现在您可以前往您的 Travis 配置文件 -> 您的仓库,获取构建徽章并将其添加到 README.md
    Build badge

更多徽章?

build:
  nodes:
      analysis:
          ...
          tests:
              override:
                  ...
                  -
                      command: vendor/bin/phpunit -c tests/phpunit.xml
                      coverage:
                          file: 'tests/coverage.xml'
                          format: 'clover'
...                                                    

以启用代码覆盖率。

  • 运行检查
  • 从摘要屏幕获取徽章
    Build badge

通过 Packagist 发布

来源

https://getcomposer.org.cn/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
https://symfony.ac.cn/doc/current/bundles.html#creating-a-bundle
https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet