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

简介: 探索 PHP project 或 package 的标准开发姿势 本人经验有限,若有不同看法或者错误的表述,欢迎交流指正,以免无人子弟 ^ ^ 基于 PDS-Skeleton 创建一个新项目,并且安装 phpunit。

探索 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 标准

image

创建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个文件夹和文件
image

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

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)
目录
相关文章
|
1天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
4天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
8月前
|
IDE NoSQL 关系型数据库
开发php,需要安装哪些工具
开发php,需要安装哪些工具
|
9月前
|
移动开发 JavaScript 前端开发
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
147 0
|
9月前
|
关系型数据库 MySQL API
漏刻有时API接口实战开发系列(12):php-mysql语句开发
漏刻有时API接口实战开发系列(12):php-mysql语句开发
41 0
|
8月前
|
移动开发 前端开发 搜索推荐
基于PHP开发的拍卖直播系统源码分享
东莞梦幻网络科技最新推出的拍卖直播系统源码,安卓端使用Java语言开发,苹果端则采用Objective-C开发,前端H5则采用了Vue.js开发,后台管理系统基于PHP的ThinkPHP框架开发。
|
8月前
|
NoSQL 测试技术 PHP
CRM系统源码PHP开发
在竞争激烈的市场中,公司需要与客户保持积极的关系。一个好的CRM(客户关系管理)系统可以帮助公司满足客户,研究将探索建立有效的CRM以满足客户的不同方法和技术。目的是检查客户关系管理 (CRM) 在保留和满足客户方面的有效性。研究表明,客户关系管理对客户满意度有显着影响,且两个变量均呈正相关关系。公司使其 CRM 变得强大和可靠,客户将更加满意并留住公司。   
|
9月前
|
IDE 关系型数据库 MySQL
window下面安装phpstudy进行PHP开发
php的集成开发环境比较多,有wamp server,xmapp,phpstudy等。经过这些年的体验,发现相对来说个人还是比较喜欢phpstudy一点。主要原因有一下几点。维护的比较频繁,一直有更新。可以灵活切换多个php版本,这样针对于不同的php项目能够很好的适应。一件集成,傻瓜安装,让开发人员关注于开发本身。
|
9月前
|
SQL 安全 关系型数据库
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
299 0