composer公共包设计

发布时间 2023-11-16 16:45:58作者: gltttt
  • 目的:封装一个公共包,供全项目使用,最大化的抽象封装,减少重复代码,里面可以包含公共函数库、工具类、跨服务调用接口类,包罗万象

  • 肯定是要用到composer管理的,两种方式:
    1、加载本地包,当所有项目部署在同一台服务器上时,可以采用这个方式,https://codeleading.com/article/50636224993/ 这篇文章说的很清楚了,我这里因为项目部署混乱,哪哪都是,所以没采用这个方式
    2、拉取一个git仓库到vender目录下,我采用的就是这个方式,composer.json文件如下

{
    "name": "topthink/think",
    "description": "the new thinkphp framework",
    "type": "project",
    "keywords": [
        "framework",
        "thinkphp",
        "ORM"
    ],
    "homepage": "http://thinkphp.cn/",
    "license": "Apache-2.0",
    "authors": [
        {
            "name": "liu21st",
            "email": "liu21st@gmail.com"
        }
    ],
    "require": {
        "php": ">=5.6.0",
        "topthink/framework": "5.1.*",
        "topthink/think-captcha": "2.0.*",
        "johnlui/aliyun-oss": "~2.0",
        "lincanbin/material-design-avatars": "^1.4",
        "topthink/think-mongo": "2.0.*",
        "symfony/var-dumper": "^5.4",
      "ext-mongodb": "*",
        "vekise/vekise_packages": "dev-master"
    },
    "repositories": [
        {
            "packagist": false
        },
        {
            "type": "git",
            "url": "https://gitee.com/shenzhen-ningyi-fashion-design/vekise-pakeages.git"
        }
    ],
    "autoload": {
        "psr-4": {
            "app\\": "application"
        }
    },
    "extra": {
        "think-path": "thinkphp"
    },
    "config": {
        "preferred-install": "dist",
        "secure-http": false
    }
}

配置自动加载

{
  "name": "vekise/vekise_packages",
  "description": "vekise",
  "type": "library",
  "require": {
    "php": ">=7.2"
  },
  "autoload": {
    "files": [
      "src/functions.php"//函数库
    ],
    "psr-4": {
      "vekise\\vekise_packages\\": "src"//工具类
    }
  }
}

每次更新包文件,第一步包文件提交推送,第二步执行composer update vekise/vekise_packages(里面应该是git pull操作)

  • 跨服务接口调用
    1、curl封装,基础请求方法,在functions.php函数库里
/**
 * Desc:http请求post方法
 * Author:glt 2023/6/30 10:10
 *
 * @param string $url
 * @param array  $data
 * @param array  $query
 * @param bool   $inner
 *
 * @return bool|string
 */
function http_post(string $url, array $data = [], array $query = [], bool $inner = FALSE)
{
    $post_data = json_encode($data, 256);
    if(!empty($query)){
        $url = $url . '?' . http_build_query($query);
    }
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $header = [];
    $header[] = 'Content-Type: application/json;charset=UTF-8';
    if($inner){
        $header[] = 'Api-Secret:' . CommonConstant::API_SECRET;
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

    return curl_exec($ch);
}

/**
 * Desc:http请求get方法
 * Author:glt 2023/6/30 11:43
 *
 * @param string $url
 * @param array  $query
 * @param bool   $inner
 *
 * @return bool|string
 */
function http_get(string $url, array $query = [], bool $inner = FALSE)
{
    if(!empty($query)){
        $url = $url . '?' . http_build_query($query);
    }
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $header = [];
    $header[] = 'Content-Type: application/json;charset=UTF-8';
    if($inner){
        $header[] = 'Api-Secret:' . CommonConstant::API_SECRET;
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

    return curl_exec($ch);
}

2、请求基类

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2023/6/30
 * Time: 10:47
 */

namespace vekise\vekise_packages\request;


class BaseRequest{

    public $server_url;

    public function post($url, $data, $query = [])
    {
        if(substr($url, 0, 1) !== '/'){
            $url = '/' . $url;
        }
        $data['origin_server'] = env('app.server_name', '');
        return json_decode(http_post($this->server_url . $url, $data, $query, TRUE), TRUE);
    }

    public function get($url, $query = [])
    {
        if(substr($url, 0, 1) !== '/'){
            $url = '/' . $url;
        }
        $query['origin_server'] = env('app.server_name', '');
        return json_decode(http_get($this->server_url . $url, $query, TRUE), TRUE);
    }

}

3、实际调用的请求类,继承BaseRequest类,可以横向扩展无限多个,env文件里配置相应服务的域名

public $server_url = '';

    public function __construct()
    {
        $this->server_url = env('app.scm_url');
    }

    /**
     * Desc::登录
     * Author:glt 2023/7/15 9:19
     * @param $param
     *
     * @return mixed
     */
    public function login($param)
    {
        return $this->post('login', $param);
    }

    /**
     * Desc:登出
     * Author:glt 2023/10/25 15:10
     * @param $param
     *
     * @return mixed
     */
    public function logout($param)
    {
        return $this->post('logout', $param);
    }

    /**
     * Desc:上传采购单
     * Author:glt 2023/8/29 14:36
     * @param $param
     *
     * @return mixed
     */
    public function purchaseUpload($param)
    {
        return $this->post('purchase/upload', $param);
    }