发布composer扩展

xiaohai 2021-05-05 21:33:28 947人围观 标签: php 
简介作为PHP程序员,composer安装扩展我们经常使用,那么如何自己编写一个扩展然后发布出去让其他人也能用自己写的扩展呢?本文主要介绍如何发布Composer扩展。

在开发的过程中,常常会使用composer去安装一些常用的包,那么如何自己开发composer包呢?本文将介绍如何开发自己的composer包。

创建GitHub项目

本步骤就不再赘述了

注册packagist账号

注册过程摸索

packagist提交

将我们Github的项目地址添加进去

在Github设置WebHook

需要从packagist获取对应的地址和ApiToken

拉取Github项目,编写核心文件

#在项目中执行,根据提示填写
comporser init

#生成内容如下
{
    "name": "sclzzhanghaijun/db_schema",
    "description": "mysql database schema",
    "license": "MIT",
    "authors": [
        {
            "name": "xiaohai",
            "email": "sclzzhanghaijun@163.com"
        }
    ],
    "require": {}
}


#创建src文件目录,其实可以只需要一个文件即可,但是这里演示了一个完整的例子,所以这里会有三个文件

#进入src目录,新建Schema.class文件,文件内容如下
<?php

namespace SCLZZHJ\Schema;

class Schema
{
    /**
     * 数据库名称
     * @var
     */
    private $dbName;

    /**
     * 执行SQL回调函数
     * @var SchemaInterFace
     */
    private $sqlExecCallBack;

    /**
     * Schema constructor.
     * @param SchemaInterFace $sqlExecCallBack
     * @param $dbName
     */
    public function __construct(SchemaInterFace $sqlExecCallBack, $dbName)
    {
        $this->sqlExecCallBack = $sqlExecCallBack;
        $this->dbName = $dbName;
    }

    /**
     * 生成数据
     * @throws SchemaException
     */
    public function make()
    {
        $tables = $this->sqlExecCallBack->SqlExec("SELECT * FROM `TABLES` WHERE `TABLE_SCHEMA` = '{$this->dbName}'");

        if (!is_array($tables)) {
            throw new SchemaException("返回结果必须是数组");
        }
        $html = '<table class="table_schema">';
        foreach ($tables as $key => $rowTable) {
            if ($key > 1) {
                $html .= '<tr>';
                $html .= '<td colspan="4">&nbsp;</td>';
                $html .= '</tr>';
            }
            $html .= '<tr class="table_name" style="font-weight: bold">';
            $html .= '<td>' . $rowTable['TABLE_NAME'] . '</td>';
            $html .= '<td colspan="3">' . $rowTable['TABLE_COMMENT'] . '</td>';
            $html .= '</tr>';
            $html .= '<tr>';
            $html .= '<td>字段名称</td>';
            $html .= '<td>字段类型</td>';
            $html .= '<td>字段描述</td>';
            $html .= '<td>备注</td>';
            $html .= '</tr>';
            $sqlColumn = "SELECT * FROM `COLUMNS` WHERE `TABLE_SCHEMA` = '{$this->dbName}' AND `TABLE_NAME` = '{$rowTable['TABLE_NAME']}'"; //构建查询语句
            $queryColumns = $this->sqlExecCallBack->SqlExec($sqlColumn);
            if (!is_array($queryColumns)) {

            }
            foreach ($queryColumns as $rowColumn) {
                $html .= '<tr>';
                $html .= '<td>' . $rowColumn['COLUMN_NAME'] . '</td>';
                $html .= '<td>' . $rowColumn['COLUMN_TYPE'] . '</td>';
                $html .= '<td>' . $rowColumn['COLUMN_COMMENT'] . '</td>';
                $html .= '<td>&nbsp;</td>';
                $html .= '</tr>';
            }
        }
        $html .= '</table>';
        return $html;
    }
}

#创建SchemaInterFace.php,文件内容如下:
<?php

namespace SCLZZHJ\Schema;


interface SchemaInterFace
{
    public function SqlExec($sql);
}


#新建SchemaException.php,文件内容如下:
<?php

namespace SCLZZHJ\Schema;

class SchemaException extends \Exception
{

}

修改composer.json

需要添加如下内容

"autoload": {
    "psr-4": {
        "SCLZZHJ\\Schema\\": "src"
    }
}

添加测试文件

#在项目跟目录下创建test目录

#新建测试文件Test_Schema.php,内容如下
<?php

require_once "../vendor/autoload.php";

class TestSchema implements \SCLZZHJ\Schema\SchemaInterFace
{
    public function SqlExec($sql)
    {
        if (strstr($sql, "`TABLES`") !== false) {
            return [
                ['TABLE_NAME' => 'table_1', 'TABLE_COMMENT' => '表1'],
                ['TABLE_NAME' => 'table_2', 'TABLE_COMMENT' => '表2'],
            ];
        } else if (strstr($sql, "`COLUMNS`")) {
            return [
                ['COLUMN_NAME' => 'column_1', 'COLUMN_COMMENT' => '列1', 'COLUMN_TYPE' => 'varchar'],
                ['COLUMN_NAME' => 'column_2', 'COLUMN_COMMENT' => '列2', 'COLUMN_TYPE' => 'int'],
                ['COLUMN_NAME' => 'column_3', 'COLUMN_COMMENT' => '列3', 'COLUMN_TYPE' => 'text'],
            ];
        }
        throw new SCLZZHJ\Schema\SchemaException("错误的查询");
    }
}


$schema = new SCLZZHJ\Schema\Schema(new TestSchema(), "name");

try {
    $table = $schema->make();
    $html = <<<EOF
    <html lang="zh">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style ="text/css">
    /*table start*/  
    table{  
        /* -moz-border-radius: 5px;  
        -webkit-border-radius:5px;  
        border-radius:5px; */  
        margin: auto;
        width: 50%;  
        border:solid #333;   
        border-width:1px 0px 0px 1px;  
        font-size: #333;  
        border-collapse: collapse;  
        border-spacing: 0;  
        font-size: 13px;
    }  
    table tbody tr{  
        height: 20px;  
        line-height: 20px;  
    }  
    table tbody tr.odd{  
        background-color: #fff;  
    }  
    table tbody tr.even{  
        background-color: #F5F5F5;  
    }  
    table tbody tr:hover{  
        background-color: #eee;  
    }  
    table tbody tr th,table tbody tr td{  
        padding:3px 5px;  
        text-align: left;  
        /* border: 1px solid #ddd; */  
        border:solid #333;   
        border-width:0px 1px 1px 0px;   
    }  
    table tbody tr th{  
        font-weight: bold;  
        text-align: center;  
    }  
    table tbody tr td a:hover{  
        color:#0080c0;  
    }  
    /*table end*/ 
</style>
EOF;
    $html .= "<body>" . $table . "</body></html>";
    file_put_contents("../index.html", $html);
} catch (\Exception $exception) {
    echo $exception->getMessage();
}


#然后进行执行
php Test_Schema.php

推送到Github

发布

#注意 composer.json 中的 version 信息一定要与 tag 保持一致!
#修改 composer.json 中的版本信息
"version": "0.0.1",

#添加 tag
git tag -a 0.0.1 -m '初始版本 0.0.1'

git push origin 0.0.1

在其他项目使用该包

composer require sclzzhanghaijun/db_schema