個人demo,實現的是一個相似tp3的路由功能。文家目錄和代碼以下:php
<?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
根目錄下就生成了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
在根目錄下新建一個測試文件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();
而後建立控制器目錄和文件,以下:模塊化
<?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
獲得
OK!測試經過!下一步就是上傳到packagist和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
咱們的composer包,是經過https://packagist.org/管理的。因此首先須要在這裏註冊一個帳號。
點擊頂部導航條中的Summit按鈕,
在輸入框中輸入github上的倉庫地址 ,
而後點擊Check按鈕,
Packagist會去檢測此倉庫地址的代碼是否符合Composer的Package包的要求
檢測正常的話,會出現Submit按鈕,再點擊一下Submit按鈕,咱們的包就提交到Packagist上了
以上步驟完成,就能夠驗證包是否能從庫中查詢到而且驗證是否可以成功安裝,特別注意,由於剛提交,尚未設置版本,此時版本默認是dev-master,若是直接require包名,會提示找不到對應版本,務必加上版本指定,這裏是:dev-master
composer require martist/router dev-master
效果以下:
## 設置版本
版本默認是dev-master,Composer包的版本號會從Git的tag中同步過來,所以先設置項目代碼的tag,回到項目目錄
git tag 1.0.0 git push --tag
手動更新下(也能夠用設置github裏面項目setting的webhook設置,自動更新版本)
解決後的狀況:
至此,發佈了一個屬於你本身的composer組件包。