-
目的:封装一个公共包,供全项目使用,最大化的抽象封装,减少重复代码,里面可以包含公共函数库、工具类、跨服务调用接口类,包罗万象
-
肯定是要用到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);
}