探索 PHP project 或 package 的标准开发姿势

探索 PHP project 或 package 的合理开发姿势

合适的开发姿势对于开发优秀的项目或产品是很重要的,无奈本人经验有限,若有不同看法或者错误的表述,欢迎交流指正,以免无人子弟 ^ ^

基于 PDS-Skeleton 创建一个新项目,并且安装 phpunit。

git clone https://github.com/php-pds/skeleton blog
cd blog
composer require phpunit/phpunit --dev

进入项目目录后,可以看到当前的结构为

ryandeMacBook-Pro:blog ryan$ pwd
/Users/ryan/dev/product/blog
ryandeMacBook-Pro:blog ryan$ ll
total 176
-rw-r--r--   1 ryan  staff    211 12  4 16:56 CHANGELOG.md
-rw-r--r--   1 ryan  staff  20137 12  4 16:56 LICENSE
-rw-r--r--   1 ryan  staff   5636 12  4 16:56 README.md
drwxr-xr-x   3 ryan  staff    102 12  4 16:56 bin
-rw-r--r--   1 ryan  staff    484 12  4 16:57 composer.json
-rw-r--r--   1 ryan  staff  52116 12  4 16:57 composer.lock
drwxr-xr-x   3 ryan  staff    102 12  4 16:56 docs
drwxr-xr-x   6 ryan  staff    204 12  4 16:56 src
drwxr-xr-x   4 ryan  staff    136 12  4 16:56 tests
drwxr-xr-x  14 ryan  staff    476 12  4 16:57 vendor

检验当前目录是否符合 PDS 标准

创建web 项目缺失的几个标准目录(如果是开发第三方包,不需要这些目录),注意generate 后面一定要指定项目目录,否则文件将会被创建到家目录中 - -

ryandeMacBook-Pro:blog ryan$ bin/pds-skeleton generate ./
Created /Users/ryan/dev/product/blog/config
Created /Users/ryan/dev/product/blog/public
Created /Users/ryan/dev/product/blog/resources
Created CONTRIBUTING.md

再看一下现在的目录结构,可以看到的确多了上面输出结果提示的 4个文件夹和文件

可以看到这样的目录结构就我们要的完整结构,下面让我们删掉额外的文件

rm bin/* src/* docs/* tests/*

我们决定以 TDD 的方式开发项目,在项目根目录下创建 phpunit.xml,写入以下内容

<phpunit colors="true" bootstrap="tests/autoload.php">
    <filter>
        <whitelist>
            <directory suffix=".php">src/</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="tap" target="tests/build/report.tap"/>
        <log type="junit" target="tests/build/report.junit.xml"/>
        <log type="coverage-html" target="tests/build/coverage" charset="UTF-8" yui="true" highlight="true"/>
        <log type="coverage-text" target="tests/build/coverage.txt"/>
        <log type="coverage-clover" target="tests/build/logs/clover.xml"/>
    </logging>
    <testsuites>
        <testsuite name="converter">
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

bootstrap 节点会告诉phpunit 在测试开始前需要加载哪些PHP 文件;创建 tests/autoload.php 并写入一下内容

<?php
require_once __DIR__.'/../vendor/autoload.php';

现在假设我们要测试 BlogEngineDomainPost 类。让我们先写测试,创建 tests/Blog/Engine/Domain/PostTest.php

mkdir -p ./tests/Blog/Engine/Domain/ && touch ./tests/Blog/Engine/Domain/PostTest.php

PostTest.php 代码如下

<?php
namespace Blog\Engine\Domain;

use PHPUnit\Framework\TestCase;

class PostTest extends TestCase
{
    public function testPost()
    {
        $post = new Post();
        $this->assertInstanceOf('\Blog\Engine\Domain\Post', $post);
    }
}

如果我们现在执行 php vendor/bin/phpunit,会得到以下错误

ryandeMacBook-Pro:blog ryan$ php vendor/bin/phpunit
PHPUnit 6.5.2 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 107 ms, Memory: 4.00MB

There was 1 error:

1) Blog\Engine\Domain\PostTest::testPost
Error: Class 'Blog\Engine\Domain\Post' not found

/Users/ryan/dev/product/blog/tests/Blog/Engine/Domain/PostTest.php:10

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

错误很明显,BlogEngineDomainPost 找不到,我们马上来写一个

mkdir -p ./src/Blog/Engine/Domain/ && touch ./src/Blog/Engine/Domain/Post.php

Post.php 文件包含如下代码,TDD 方式开发时,业务代码只需刚好满足测试通过即可

<?php

namespace Blog\Engine\Domain;

class Post
{
}

我们再执行 php vendor/bin/phpunit,仍然会得到以下错误

ryandeMacBook-Pro:blog ryan$ php vendor/bin/phpunit
PHPUnit 6.5.2 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 107 ms, Memory: 4.00MB

There was 1 error:

1) Blog\Engine\Domain\PostTest::testPost
Error: Class 'Blog\Engine\Domain\Post' not found

/Users/ryan/dev/product/blog/tests/Blog/Engine/Domain/PostTest.php:10

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

oops~,什么情况,还是找不到类的定义,看一下当前的 composer.json 文件内容

{
    "name": "pds/skeleton",
    "type": "standard",
    "description": "Standard for PHP package skeletons.",
    "homepage": "https://github.com/php-pds/skeleton",
    "license": "CC-BY-SA-4.0",
    "autoload": {
        "psr-4": {
            "Pds\\Skeleton\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Pds\\Skeleton\\": "tests/"
        }
    },
    "bin": ["bin/pds-skeleton"],
    "require-dev": {
        "phpunit/phpunit": "^6.5"
    }
}

你一定注意到了 autoload 和 autoload-dev,这个选项可以指定psr-4 的命名空间和其对应的文件路径,下面我们来指定一下 Blog 命名空间指向的路径

{
    "name": "pds/skeleton",
    "type": "standard",
    "description": "Standard for PHP package skeletons.",
    "homepage": "https://github.com/php-pds/skeleton",
    "license": "CC-BY-SA-4.0",
    "autoload": {
        "psr-4": {
            "Blog\\": "src/Blog"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Blog\\": "tests/Blog"
        }
    },
    "bin": ["bin/pds-skeleton"],
    "require-dev": {
        "phpunit/phpunit": "^6.5"
    }
}

重新执行 php vendor/bin/phpunit,bravo~

ryandeMacBook-Pro:blog ryan$ php vendor/bin/phpunit
PHPUnit 6.5.2 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 91 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
时间: 2024-09-27 06:58:06

探索 PHP project 或 package 的标准开发姿势的相关文章

微软正式发布Project,Spark,用户可自行开发游戏

微软正式发布了ProjectSpark--一款用户可用来自行开发和分享游戏的工具包,供Xbox,One和Windows,8.1用户免费下载.另外,微软还以40美元(约合人民币246元)的价格销售一款盒装版Project,Spark,其中包括价值85美元(约合人民币523元)的可下载的角色.主题.游戏和其他内容.Project,Spark,6个月前进入β测试阶段,公布时间是2013年.Project,Spark使用户能自行设计游戏,创建角色,利用if-then(如果- 那么)触发器制定游戏规则.用

Web开发模式实例:MVC--迈向标准开发

实例: 用一个用户登录验证实例讲解MVC设计模式 登录程序之前已经学过,是使用JSP+JDBC完成的开发操作,但是之前的登录程序开发中可以发现有很多的问题,就是一个JSP文件中代码过多了,即便是使用了JSP+javaBean的开发模式,其本身也存在JSP中代码过多的问题. 现在我们就可以利用MVC设计模式来彻底解决掉这些代码过多的问题了 在本程序中,用户输入的登录信息提交给Servlet进行接收,Servlet接收到请求内容后首先对其合法性进行检验(如果输入的内容是否为空或者长度是否满足要求等)

探索PMML预测分析和开放式标准的强大功能

PMML 受多种顶级统计工具的支持.因此,将预测分析模型应用于实践的过程非常简单,因为您可以在一个工具中建立一个模型,然后立即在另一个工具中对其进行部署.在这个传感器和http://www.aliyun.com/zixun/aggregation/12240.html">数据收集日益普遍深入的世界,像 PMML 这样的预测分析和标准使人们可以从智慧解决方案中受益,并真正改变他们的生活. 如果现在有人问您是否使用过预测分析,您可能会回答 "没有".其实并非如此,您可能每天

关于前端开发:探究WEB标准

说起前端开发,我们就从一些让人打瞌睡的概念说起吧. WEB标准 什么是WEB标准?也许很多人会认为是DIV+CSS.其实这是一个错误的说法,WEB标准时一系列的技术规范,而目前主要包括XHTML1.0.CSS2.1.DOM1.0和ECMAJavaScript.当然了,WEB标准也不仅仅是一个规范,而是一系列规范的总称.而上面说的DIV+CSS是XHTML1.1结合CSS2.0的一种制作方法,严格来应该说是XHTML+CSS. 而WEB标准是由三大块组成的.首先是结构,主要是对网页的数据对象进行整

探索用户对云服务标准的期望

当云服务的运行很顺畅,而且服务水平协议 (SLA) 也能满足要求时,业务方.企业和机构可能希望将云存储的数据传输给不同的提供商,但却发现由于某些原因而做不到.其中一个原因是,用于在云中存储数据的 API 调用要求的数据格式与不同提供商用于在云中存储数据的 API 调用不兼容或不具互操作性. 于是,业务方在选择一家提供商提供云服务之前,将面临由于不同提供商采用的数据存储格式而引发的数据传输故障.(一种可降低损害的方式是与提供商谈判,从而在将数据传输给不同提供商时支持更大的灵活性.这包括将代码修改为

Cocos2d-x跨Android&amp;amp;iOS平台开发入门

很好的一篇译文,在此感谢原作者和译者.由于此文写的很早,所以文中提到的一些工具已经升级了,有了一些新的界面和操作,但大体还是能和新版本联系起来的. 原文地址:http://www.cocoachina.com/gamedev/gameengine/2012/0428/4206.html   Cocos2D是一个非常棒而且非常容易使用的游戏框架,但是,由于它是基于objc语言的,所以你只能使用它来开发ios和mac下面的游戏.   假如你可以使用和cocos2d相似的api来开发android上面

浪潮在美发布OCP标准服务器

美国当地时间3月8日,在圣克拉拉举行的OCP (Open Computing Project)Summit 2017上, 浪潮发布了符合OCP标准的整机柜服务器OR系列.这些产品将从今年下半年起,陆续向客户供货. OCP是由facebook发起的.致力于推动开放硬件技术标准,推进数据中心创新的全球性组织,成员包括google.微软.Intel等46家全球性IT企业以及互联网运营商,对于IT技术和应用的发展趋势有着重要的影响力.浪潮是OCP的铂金级别会员.   基于OCP标准的浪潮整机柜OR1.0

云标准用户协会(CSCC)发布一项新的云计算指南

制定云标准的最终用户促进组织--云标准用户协会(Cloud Standards Customer Council,CSCC)10月5日推出一项新的云计算指南,旨在加快企业的云计算应用. CSCC发布的"云计算实用指南"包括来自企业顾问.厂商和最终用户在部署云计算方面的最佳做法.资源共享和专业技术以及企业云中进行实践的可行方法. 洛克希德马丁公司高级研究员和首席战略家Melvin Greer目前担任CSCC指导委员会主席及CSCC云计算实用指南工作组主席.他在10月5日的网络研讨会上说,

Facebook将推HTML5移动开发平台

美国科技博客网站TechCrunch撰稿人希格勒(MG Siegler)近日透露,Facebook将于下周早些时候正式推出名为"斯巴达项目"(Project Spartan)的HTML5移动开发平台. 据悉,Facebook将全面对其移动网站进行改版,使应用在Facebook的移动网站上更易使用.Facebook希望通过此举来打破苹果对应用市场的垄断,同时使开发者可以更有效地在经过升级的Facebook平台上开发应用. 相关消息: Facebook活跃用户数超04年互联网用户总数Fac