Composer 的好处
- 模块化,降低代码重用成本
- 统一的第三方代码组织方式
- 更科学的版本更新
内容
我的demo,实现的是一个类似tp3的路由功能。文家目录和代码如下:
<?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);
}
}
}
然后执行初始化命令:
composer init
此处进入终端命令行交互:
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
重要的几个填写项:
- Package name(重要):包名,一般是公司名+"/"+包名 比如 baocai/yprint
- Minimum Stability:通常默认填写dev,因为第一次代码Push完,是在dev-master分支上,dev也就是最小稳定版本标识号
- Package Type:根据库类别填写,sdk,lib,都可以
- License:版权,默认填写 MIT
- 接下来填写自身库需要的依赖,默认填no,后续可以在composer.json中补充修改
根目录下就生成了composer.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/"
}
}
}
进行测试
下面我们来简单测试下我们的类是否工作正常。我们在项目根目录执行
composer install
完成初始化配置。
创建测试文件
在根目录下新建一个测试文件test.php
<?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了。
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
效果如下:
## 设置版本
版本默认是dev-master,Composer包的版本号会从Git的tag中同步过来,因此先设置项目代码的tag,回到项目目录
git tag 1.0.0
git push --tag
手动更新下(也可以用设置github里面项目setting的webhook设置,自动更新版本)
解决后的情况:
至此,发布了一个属于你自己的composer组件包。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。