一般情况下, 都在根目录下创建一个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了。