發佈一個本身的composer包

Composer 的好處

  • 模塊化,下降代碼重用成本
  • 統一的第三方代碼組織方式
  • 更科學的版本更新

內容

個人demo,實現的是一個相似tp3的路由功能。文家目錄和代碼以下:php

image.png

<?php

namespace martist;
/**
 * Created by PhpStorm.
 * User: machuang
 * Date: 2020/5/19
 * Time: 18:58
 */

class router{

    protected $mode = 1;
    protected $controllerNamespace = 'controllers';
    protected $app_path;


    function __construct()
    {
        $this->app_path = dirname(dirname(__DIR__));
    }


    function handle(){
        if($this->mode == 1){
            //get傳參方式解析方式
            $controllerName = empty($_GET['c'])?'index':$_GET['c'];
            $actionName = empty($_GET['a'])?'index':$_GET['a'];
            $ucController = ucfirst($controllerName);
            $controllerNameAll = $this->controllerNamespace . '\\' . $ucController . 'Controller';
            $controllerFile = $this->app_path.'/'.$this->controllerNamespace.'/'.$ucController . 'Controller.php';
            include_once $controllerFile;
            $controller = new $controllerNameAll();
            return call_user_func([$controller,  ucfirst($actionName)]);
        }elseif ($this->mode == 2){
            //斜槓分割路由的解析方式
            $controllerName = 'Index';
            $actionName = 'index';
            $param = array();
            $url = $_SERVER['REQUEST_URI'];
            $position = strpos($url, '?');
            $url = $position === false ? $url : substr($url, 0, $position);
            $query_str = str_replace($url,'',$_SERVER['REQUEST_URI']);
            $query_str = trim($query_str, '?');
            parse_str($query_str,$query_arr);//get方式傳遞參數

            $url = trim($url, '/');
            if ($url) {
                $urlArray = explode('/', $url);
                $urlArray = array_filter($urlArray);
                $controllerName = ucfirst($urlArray[0]);
                array_shift($urlArray);
                $actionName = $urlArray ? $urlArray[0] : $actionName;
                array_shift($urlArray);
//                $param = $urlArray ? $urlArray : array();
            }
            $controllerFile = $this->app_path.'/'.$this->controllerNamespace.'/'.$controllerName . 'Controller.php';
            include_once $controllerFile;
            $controller = $this->controllerNamespace . '\\' . $controllerName . 'Controller';
            if (!class_exists($controller)) {
                exit($controller . '控制器不存在');
            }
            if (!method_exists($controller, $actionName)) {
                exit($actionName . '方法不存在');
            }
            $dispatch = new $controller();
            call_user_func_array(array($dispatch, $actionName),$query_arr);

        }
    }

}

而後執行初始化命令:git

composer init

此處進入終端命令行交互:github

Welcome to the Composer config generator  
                                            


This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [machuang/bao]: martist/router
Description []: 路由
Author [machuang <machuang@julyedu.cn>, n to skip]: 
Minimum Stability []: 
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []: 

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: 

{
    "name": "martist/router",
    "description": "路由",
    "type": "library",
    "authors": [
        {
            "name": "machuang",
            "email": "machuang@julyedu.cn"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]? yes

重要的幾個填寫項:web

  1. Package name(重要):包名,通常是公司名+"/"+包名 好比 baocai/yprint
  2. Minimum Stability:一般默認填寫dev,由於第一次代碼Push完,是在dev-master分支上,dev也就是最小穩定版本標識號
  3. Package Type:根據庫類別填寫,sdk,lib,均可以
  4. License:版權,默認填寫 MIT
  5. 接下來填寫自身庫須要的依賴,默認填no,後續能夠在composer.json中補充修改

根目錄下就生成了composer.json文件json

添加自動加載

編輯生成的composer.json文件,添加php的版本要求和自動加載(使用PSR-4),加載src目錄下的全部文件,以下瀏覽器

{
    "name": "martist/router",
    "description": "路由",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "machuang",
            "email": "1203580780@qq.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {
            "martist\\": "src/"
        }
    }
}

進行測試
下面咱們來簡單測試下咱們的類是否工做正常。咱們在項目根目錄執行app

composer install

完成初始化配置。composer

image.png

建立測試文件

在根目錄下新建一個測試文件test.phpide

<?php
/**
 * Created by PhpStorm.
 * User: machuang
 * Date: 2020/5/19
 * Time: 19:03
 */

include_once "./bao/vendor/autoload.php";

(new martist\router())->handle();

而後建立控制器目錄和文件,以下:
image.png模塊化

<?php

namespace controllers;
/**
 * Created by PhpStorm.
 * User: machuang
 * Date: 2020/5/20
 * Time: 10:51
 */
class SiteController
{

    public function index(){
        echo 'Site Index';
    }


}

而後在終端運行起來:

php -S 127.0.0.1:10000

在瀏覽器訪問地址:http://127.0.0.1:10000/c=site&a=index

獲得

image.png

OK!測試經過!下一步就是上傳到packagist和github了。

github

1.new project
2.建立Git忽略文件.gitignore,內容是

/vendor/

3.在包文件根目錄:

git add .
git commit -m 'composer init'
git remote add origin git@github.com:ma1203580780/route.git
git push

packagist

咱們的composer包,是經過https://packagist.org/管理的。因此首先須要在這裏註冊一個帳號。

點擊頂部導航條中的Summit按鈕,
在輸入框中輸入github上的倉庫地址 ,
而後點擊Check按鈕,
Packagist會去檢測此倉庫地址的代碼是否符合Composer的Package包的要求
檢測正常的話,會出現Submit按鈕,再點擊一下Submit按鈕,咱們的包就提交到Packagist上了

驗證包安裝

以上步驟完成,就能夠驗證包是否能從庫中查詢到而且驗證是否可以成功安裝,特別注意,由於剛提交,尚未設置版本,此時版本默認是dev-master,若是直接require包名,會提示找不到對應版本,務必加上版本指定,這裏是:dev-master

composer require martist/router dev-master

效果以下:
image.png

## 設置版本

版本默認是dev-master,Composer包的版本號會從Git的tag中同步過來,所以先設置項目代碼的tag,回到項目目錄

git tag 1.0.0
git push --tag

手動更新下(也能夠用設置github裏面項目setting的webhook設置,自動更新版本)
image.png

解決後的狀況:

image.png

至此,發佈了一個屬於你本身的composer組件包。

分享

image.png

相關文章
相關標籤/搜索