在Laravel下面开发扩展包教程, 并添加单元测试, 并推送到packagist.org上面

一般情况下, 都在根目录下创建一个packages目录, 这个就是扩展包的顶级目录,下面我们创建一个自己的扩展包:packages/laratest/src,所有的开发文件, 都在src下面。那么我们如何告诉Laravel去自动加载这下面的文件呢?

修改composer.json文件,在autoload->psr-4下面添加内容Laratest\\Hasher:”packges/laratest/md5hasher/src”,再执行composer dump-autoload去重新生成autoload
之后在目录下面创建文件,如:Md5Hasher.php,
<?php
namespace Laratest\\Hasher; //这里的命名空间=autoload下面的命名空间(上面亮黄色的文字)

namespace PichyLaravel\Hasher;
class Md5Hasher
{
    //代码逻辑都在这里
    public function make($value, array $options = [])
    {
        $salt = isset($options['salt']) ? $options['salt'] : '';
        return hash('md5', $value . $salt);
    }

    public function check($value, $HashValue, array $options = [])
    {
        $salt = isset($options['salt']) ? $options['salt'] : '';
        return hash('md5', $value . $salt) === $HashValue;
    }
}

生成serviceProvider(服务提拱者),
namespace PichyLaravel\Hasher; 
use Illuminate\Support\ServiceProvider;
class Md5HasherProvider extends ServiceProvider
{

    public function register()
    {
$this->app->singleton('md5hash',function(){
return new Md5Hasher();
})
    }
}

//将服务提拱者加入config/app.php

'providers' => [
..
..
PichyLaravel\Hasher\Md5HasherProvider::class;
]

//利用tinker作测试

php artisan tinker
>>> app('md5hash')->make('123456')
=> "e10adc3949ba59abbe56e057f20f883e"
>>> app('md5hash')->check('123456','e10adc3949ba59abbe56e057f20f883e')
=> true
>>> app('md5hash')->make('123456', ['salt' => 'cuhjsd'])
=> "5d9c12f1f0e12cc8013ae7bcbd889e29"
>>>

OK,测试成功, 程序可以正常使用。

接下来, 要做的就是利用PHPUNIT做单元测试。
生成composer文件, 生成后的文件内容如下:
{
  "name": "pichylaravel/md5hash",
  "description": "md5hash test",
  "type": "project",
  "license": "MIT",
  "authors": [
    {
      "name": "zhanglong",
      "email": "nice5good@126.com"
    }
  ],
  "require": {
  },
  "require-dev": {
    "phpunit/phpunit": "5.5.*"   //因为要用到单元测试,一般都用在开发环境, 这里只放到require-dev节点里
  },
  "autoload": {
    "psr-4": {
      "PichyLaravel\\Hasher\\": "src" //这里个人理解应该是,别人下载用的时候,告诉composer我要自动加载src目录下面的文件,命名空间是PichyLaravel\Hasher
    }
  }
}

生成完composer.json以后, 执行一下composer update。执行完成后, 在packges/laratest/md5hasher/ 下面应该会有vendor目录 。

创建tests目录, 并新建测试文件。
tests/Md5HasherTest内容如下:
<?php
class Md5HasherTest extends \PHPUnit\Framework\TestCase
{
    protected $hasher;

  // 这里的setUp, 相当于__construction函数,程序首先会执行这个函数里的代码逻辑
    public function setUp()
    {
        $this->hasher = new \PichyLaravel\Hasher\Md5Hasher();
    }

   //测试单元的函数, 必须要以test为前缀, 否则phpunit不会执行,直接忽略
    public function testMd5HasherMake()
    {
      //测试密码生成之后是否一样
        $password = md5('long1991');
        $passwordTwo = $this->hasher->make('long1991');
        return $this->assertEquals($password, $passwordTwo);
    }

    public function testMd5HasherCheck()
    {
      //测试密码是否一致
        $password = md5('long1991');
        $result = $this->hasher->check('long1991', $password);
        return $this->assertTrue($result);
    }
}

文件保存成功后, 我们直接执行命令:

vendor/bin/phpunit tests/Md5HasherTest (这条命令是在Git Bash里面执行的), 来看下执行结果:
有2个测试结果,全部通过。
单元测试,还有别外一种方法,直接说一下
把根目录下面的phpunit.xml直接复制到packges/laratest/md5hasher/ 目录下,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="project test suit">
            <directory suffix="Test.php">./tests</directory> //这行的意思个人理解应该是, 这是一个测试单元, 并查找结尾为Test.php, 目录是tests目录,
        </testsuite>
    </testsuites>
</phpunit>

之后, 我们直接在这个目录下, 直接执行phpunit命令(在phpstorm内置的命令行执行的),也可以得到相同的结果。关于phpunit命令的安装方法详见 https://www.cnblogs.com/IT–Loding/p/6222147.html

到这里, 单元测试也OK了, 接下来, 我们看一下

如何把扩展包推送到packagist上面。

1、在github上面, 创建一个仓库,具体流程这里就不介绍了, 相信大家对于建立一个git仓库早已经滚瓜烂熟了
2、本地packges/laratest/md5hasher/ 目录下面执行命令 git init 来初始化本地仓库, 并把本地仓库的代码提交到本地仓库。(这里要新建一个.gitignore文件, 来忽略一些不必要的文件)
.gitignore文件内容
/vendor
composer.lock

3、关联远程仓库,执行命令

git remote add origin 这里跟上你的git仓库地址
git push origin master // 我们先将代码推送到远程仓库。
4、在packagist上面提交代码,
访问,https://packagist.org/packages/submit,将GIT的仓库地址,粘贴到输入框内, 这里的地址是(https://github.com/pichylaravel/md5hash),点击check之后, 没有重复的扩展包,并提交.
首次提交后, 会有这个提示:
This package is not auto-updated. Please set up the GitHub Hook for Packagist so that it gets updated whenever you push!
这个提示告诉我们,添加一下github hook, 下次我们项目推送更新的时候, packagist也会自动更新.点击Github Hook, 这里会告诉我们怎样给当前项目添加Webhooks.
到github的项目详情, 点Settings->Webhooks->Add webhook,把我们的信息添加上(https://packagist.org/about#how-to-update-packages)这里有你想要信息,其它的选项不动,点击 保存按钮就可以了.
添加完成后, 我们来看下效果
刚才的提示没有了, 说明下次我们推送的时候,会自动更新. 我们注意一下右下角的状态, 现在是dev-master,等一下我们推送一下Tag,这里也会自动更新.我们来试一下
5、执行命令
git tag v1.0
git push --tags

最后, 我们推送一个v1.0的tag后, 再刷新packagist, 自动把最新的版本指向v1.0了。

0

发表评论

电子邮件地址不会被公开。