Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
meibuyu-rpc
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
without authentication
meibuyu-rpc
Commits
b240a5a6
Commit
b240a5a6
authored
Sep 01, 2020
by
王源
🎧
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'test'
parents
917a98c4
f3469ff9
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
926 additions
and
14 deletions
+926
-14
ConfigProvider.php
src/ConfigProvider.php
+1
-0
MicroExceptionHandler.php
src/Exceptions/Handler/MicroExceptionHandler.php
+2
-2
PhpSpreadsheetExceptionHandler.php
src/Exceptions/Handler/PhpSpreadsheetExceptionHandler.php
+51
-0
QueryExceptionHandler.php
src/Exceptions/Handler/QueryExceptionHandler.php
+2
-1
MessageHandler.php
src/Handler/MessageHandler.php
+16
-0
UploadManager.php
src/Manager/UploadManager.php
+44
-0
CheckWebhookMiddleware.php
src/Middleware/CheckWebhookMiddleware.php
+33
-0
ProcessFormServiceInterface.php
src/Service/Interfaces/Flow/ProcessFormServiceInterface.php
+17
-0
ShopifyServiceInterface.php
src/Service/Interfaces/Order/ShopifyServiceInterface.php
+23
-0
PlatformProductChildServiceInterface.php
...terfaces/Product/PlatformProductChildServiceInterface.php
+5
-5
ProductChildServiceInterface.php
...rvice/Interfaces/Product/ProductChildServiceInterface.php
+3
-3
StoreServiceInterface.php
src/Service/Interfaces/StoreServiceInterface.php
+56
-3
ShopifyApp.php
src/Shopify/ShopifyApp.php
+124
-0
ShopifyFactory.php
src/Shopify/ShopifyFactory.php
+35
-0
AbstractShopify.php
src/Shopify/lib/AbstractShopify.php
+287
-0
Collect.php
src/Shopify/lib/Collect.php
+16
-0
Collection.php
src/Shopify/lib/Collection.php
+28
-0
CustomCollection.php
src/Shopify/lib/CustomCollection.php
+28
-0
Metafield.php
src/Shopify/lib/Metafield.php
+16
-0
SmartCollection.php
src/Shopify/lib/SmartCollection.php
+28
-0
Webhook.php
src/Shopify/lib/Webhook.php
+16
-0
HttpRequestJson.php
src/Tools/HttpRequestJson.php
+72
-0
functions.php
src/functions.php
+23
-0
No files found.
src/ConfigProvider.php
View file @
b240a5a6
...
...
@@ -19,6 +19,7 @@ class ConfigProvider
'http'
=>
[
\Meibuyu\Micro\Exceptions\Handler\MicroExceptionHandler
::
class
,
\Meibuyu\Micro\Exceptions\Handler\QueryExceptionHandler
::
class
,
\Meibuyu\Micro\Exceptions\Handler\PhpSpreadsheetExceptionHandler
::
class
,
\Meibuyu\Micro\Exceptions\Handler\AppExceptionHandler
::
class
,
],
],
...
...
src/Exceptions/Handler/MicroExceptionHandler.php
View file @
b240a5a6
...
...
@@ -9,7 +9,6 @@
namespace
Meibuyu\Micro\Exceptions\Handler
;
use
Hyperf\ExceptionHandler\ExceptionHandler
;
use
Hyperf\HttpMessage\Stream\SwooleStream
;
use
Meibuyu\Micro\Exceptions\HttpResponseException
;
...
...
@@ -53,4 +52,5 @@ class MicroExceptionHandler extends ExceptionHandler
{
return
true
;
}
}
\ No newline at end of file
}
src/Exceptions/Handler/PhpSpreadsheetExceptionHandler.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/24
* Time: 18:05
*/
namespace
Meibuyu\Micro\Exceptions\Handler
;
use
Hyperf\ExceptionHandler\ExceptionHandler
;
use
Hyperf\HttpMessage\Stream\SwooleStream
;
use
PhpOffice\PhpSpreadsheet\Exception
as
PhpSpreadsheetException
;
use
Psr\Http\Message\ResponseInterface
;
use
Throwable
;
class
PhpSpreadsheetExceptionHandler
extends
ExceptionHandler
{
public
function
handle
(
Throwable
$throwable
,
ResponseInterface
$response
)
{
$error
=
$throwable
->
getMessage
();
if
(
$throwable
instanceof
PhpSpreadsheetException
)
{
if
(
strpos
(
$error
,
'Formula Error'
)
!==
false
)
{
$msg
=
'表格公式错误, 请检查是否引用其它表格数据'
;
return
$this
->
jsonResponse
(
$msg
,
$response
);
}
}
else
if
(
strpos
(
$error
,
'PhpOffice\PhpSpreadsheet\Writer\Xls::writeSummaryProp()'
)
!==
false
)
{
$msg
=
'表格格式兼容错误,请上传 xlsx 结尾的excel'
;
return
$this
->
jsonResponse
(
$msg
,
$response
);
}
return
$response
;
}
public
function
jsonResponse
(
$msg
,
ResponseInterface
$response
)
{
// 阻止异常冒泡
$this
->
stopPropagation
();
// 格式化输出
$data
=
json_encode
([
'code'
=>
400
,
'msg'
=>
$msg
,
],
JSON_UNESCAPED_UNICODE
);
return
$response
->
withAddedHeader
(
'content-type'
,
'application/json'
)
->
withBody
(
new
SwooleStream
(
$data
));
}
public
function
isValid
(
Throwable
$throwable
)
:
bool
{
return
true
;
}
}
src/Exceptions/Handler/QueryExceptionHandler.php
View file @
b240a5a6
...
...
@@ -42,4 +42,5 @@ class QueryExceptionHandler extends ExceptionHandler
{
return
$throwable
instanceof
QueryException
;
}
}
\ No newline at end of file
}
src/Handler/MessageHandler.php
View file @
b240a5a6
...
...
@@ -81,6 +81,22 @@ class MessageHandler
$this
->
messageService
->
send
(
$receiverIds
,
$application
,
$templateId
,
0
,
$replace
);
}
/**
* 自动发送文本消息
* @param $receiverIds
* @param $content
* @throws \Exception
*/
public
function
sendAutoText
(
$receiverIds
,
$content
)
{
$application
=
$this
->
config
->
get
(
'app_name'
);
if
(
!
$application
)
{
throw
new
\Exception
(
"请设置应用名app_name"
);
}
$receiverIds
=
is_array
(
$receiverIds
)
?
$receiverIds
:
[
$receiverIds
];
$this
->
messageService
->
send
(
$receiverIds
,
$application
,
0
,
0
,
[],
$content
);
}
/**
* 定时任务专用 发送文本消息
* @param $receiverIds
...
...
src/Manager/UploadManager.php
View file @
b240a5a6
...
...
@@ -118,6 +118,50 @@ class UploadManager
}
}
/**
* 文件上传方法(micro-api-flow)
* @param UploadedFile $file 上传的文件
* @param array $options 配置参数
* @param bool $realPath
* @return string
* @throws HttpResponseException
*/
public
static
function
uploadFileGetName
(
$file
,
$options
=
[],
$realPath
=
false
)
{
$documentRoot
=
config
(
'server.settings.document_root'
);
if
(
!
$documentRoot
)
{
throw
new
\RuntimeException
(
'未配置静态资源'
);
}
$options
=
self
::
parseOptions
(
$options
);
if
(
$file
->
isValid
())
{
$extension
=
strtolower
(
$file
->
getExtension
());
// 通过扩展名判断类型
if
(
!
in_array
(
$extension
,
$options
[
'mime'
]))
{
throw
new
HttpResponseException
(
'文件类型不支持,目前只支持'
.
implode
(
','
,
$options
[
'mime'
]));
}
// 判断文件大小
if
(
$file
->
getSize
()
>
$options
[
'maxSize'
])
{
throw
new
HttpResponseException
(
'文件超出系统规定的大小,最大不能超过'
.
num_2_file_size
(
$options
[
'maxSize'
]));
}
// 文件重命名,由当前日期时间 + 唯一ID + 扩展名
$fileName
=
date
(
'YmdHis'
)
.
uniqid
()
.
'.'
.
$extension
;
$name
=
$file
->
toArray
()[
'name'
];
$savePath
=
self
::
parsePath
(
$options
,
$documentRoot
)
.
$fileName
;
$file
->
moveTo
(
$savePath
);
if
(
$file
->
isMoved
())
{
if
(
$realPath
)
{
return
$savePath
.
'?'
.
$name
;
}
else
{
return
str_replace
(
$documentRoot
,
''
,
$savePath
.
'?'
.
$name
);
}
}
else
{
throw
new
HttpResponseException
(
'文件保存失败'
);
}
}
else
{
throw
new
HttpResponseException
(
'文件无效'
);
}
}
/**
* 生成头像
* @return string|string[]
...
...
src/Middleware/CheckWebhookMiddleware.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/24
* Time: 9:33
*/
namespace
Meibuyu\Micro\Middleware
;
use
Psr\Http\Message\ResponseInterface
;
use
Psr\Http\Message\ServerRequestInterface
;
use
Psr\Http\Server\MiddlewareInterface
;
use
Psr\Http\Server\RequestHandlerInterface
;
class
CheckWebhookMiddleware
implements
MiddlewareInterface
{
/**
* @inheritDoc
*/
public
function
process
(
ServerRequestInterface
$request
,
RequestHandlerInterface
$handler
)
:
ResponseInterface
{
$domain
=
$request
->
getHeader
(
'x-shopify-shop-domain'
)[
0
]
??
null
;
$topic
=
$request
->
getHeader
(
'x-shopify-topic'
)[
0
]
??
null
;
if
(
$domain
&&
$topic
)
{
return
$handler
->
handle
(
$request
);
}
else
{
return
response
()
->
withStatus
(
500
);
}
}
}
src/Service/Interfaces/Flow/ProcessFormServiceInterface.php
0 → 100644
View file @
b240a5a6
<?php
namespace
Meibuyu\Micro\Service\Interfaces\Flow
;
interface
ProcessFormServiceInterface
{
/**
* 创建流程申请
* @param $processId 流程id
* @param $url 表单图片地址
* @param $data 表单详细内容
* @return mixed
*/
public
function
createProcessForm
(
$processId
,
$url
,
$data
);
}
\ No newline at end of file
src/Service/Interfaces/Order/ShopifyServiceInterface.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: 姜克保
* Date: 2020/5/20
* Time: 15:48
*/
namespace
Meibuyu\Micro\Service\Interfaces\Order
;
interface
ShopifyServiceInterface
{
/**
* shopify 推送订单信息
* @param string $topic 动作
* @param array $array 订单信息
* @param array $shopifySite 站点信息
* @return mixed
*/
public
function
pushOrder
(
$topic
,
array
$array
=
[],
array
$shopifySite
=
[]);
}
src/Service/Interfaces/Product/PlatformProductChildServiceInterface.php
View file @
b240a5a6
...
...
@@ -24,7 +24,7 @@ interface PlatformProductChildServiceInterface
/**
* 通过id列表获取平台子产品数组
* @param array $idList 平台子产品id的列表, 默认去重
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"]
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"
,"packs"
]
* @param array $columns 平台子产品表的字段,默认全部字段
* ['id','platform_product_id','product_child_id','platform_product_child_sku','asin','fnsku','is_sale']
* @return array 默认keyBy('id')
...
...
@@ -35,7 +35,7 @@ interface PlatformProductChildServiceInterface
* 获取单个数据
* @param string $sku 平台子产品sku
* @param int $siteId 平台子产品所属站点
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"]
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"
,"packs"
]
* @param array $columns 平台子产品表的字段,默认全部字段
* ['id','platform_product_id','product_child_id','platform_product_child_sku','asin','fnsku','is_sale']
* @return array
...
...
@@ -46,7 +46,7 @@ interface PlatformProductChildServiceInterface
* 通过sku列表获取平台子产品数组
* @param array $skuList 平台子产品sku的列表, 默认去重
* @param int $siteId 平台子产品所属站点
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"]
* @param array $relations 平台子产品的关联关系,支持:["platform_product","product_child","weight"
,"packs"
]
* @param array $columns 平台子产品表的字段,默认全部字段
* ['id','platform_product_id','product_child_id','platform_product_child_sku','asin','fnsku','is_sale']
* @return array 默认keyBy('platform_product_child_sku')
...
...
@@ -62,7 +62,7 @@ interface PlatformProductChildServiceInterface
public
function
getIdsByChildSku
(
string
$childSku
,
array
$limitIds
=
null
);
/**
* 获取仓库
子sku对应的平台子
sku
* 获取仓库
主sku对应的平台主
sku
* @param array $productChildIds 已去重
* @param null $siteId 指定站点id, 不传或传null,获取全部数据
* @param array $columns
...
...
@@ -74,7 +74,7 @@ interface PlatformProductChildServiceInterface
* 通过仓库产品id获取平台子产品数组
* @param $productId
* @param null $siteId
* @param array $relations
* @param array $relations
平台子产品的关联关系,支持:["platform_product","product_child","weight","packs"]
* @param array $columns
* @return array
*/
...
...
src/Service/Interfaces/Product/ProductChildServiceInterface.php
View file @
b240a5a6
...
...
@@ -15,7 +15,7 @@ interface ProductChildServiceInterface
* 获取单个数据
* @param int $id 子SKU id
* @param array $columns 子SKU表的字段,默认显示全部
* @param array $relations 子SKU的关联关系,可传入['brand', 'category', 'product_name', 'images', 'cost']
* @param array $relations 子SKU的关联关系,可传入['brand', 'category', 'product_name', 'images', 'cost'
, 'weight', 'packs'
]
* @return array|null
*/
public
function
get
(
$id
,
array
$columns
=
[
'*'
],
array
$relations
=
[]);
...
...
@@ -24,7 +24,7 @@ interface ProductChildServiceInterface
* 通过id列表获取产品数组
* @param array $idList 子SKUid的列表, 默认去重
* @param array $columns 子SKU表的字段,默认显示全部
* @param array $relations 子SKU的关联关系,可传入['brand', 'category', 'product_name', 'images', 'cost']
* @param array $relations 子SKU的关联关系,可传入['brand', 'category', 'product_name', 'images', 'cost'
, 'weight', 'packs'
]
* @return array 默认keyBy('id')
*/
public
function
getByIdList
(
array
$idList
,
array
$columns
=
[
'*'
],
array
$relations
=
[])
:
array
;
...
...
@@ -33,7 +33,7 @@ interface ProductChildServiceInterface
* 通过sku列表获取子产品列表
* @param array $skuList 默认去重
* @param array $columns 子SKU表的字段,默认返回id
* @param array $relations 子SKU的关联关系,可传入['color', 'size','brand', 'category', 'product_name', 'images', 'cost', 'weight']
* @param array $relations 子SKU的关联关系,可传入['color', 'size','brand', 'category', 'product_name', 'images', 'cost', 'weight'
, 'packs'
]
* @return array 默认keyBy('child_sku')
*/
public
function
getListBySkuList
(
array
$skuList
,
array
$columns
=
[
'id'
],
array
$relations
=
[]);
...
...
src/Service/Interfaces/StoreServiceInterface.php
View file @
b240a5a6
...
...
@@ -23,7 +23,27 @@ interface StoreServiceInterface
/**
* description:创建入库单
* author: fuyunnan
* @param array $data 需要入库的数组 格式请参考yapi 入库添加
* @param array $data 需要入库的数组 格式 入库添加
* *
data[master][warehousing_date]:2020-01-08 入库时间
data[master][creator_id]:12 创建人id
data[master][warehouse_id]:2 仓库id
data[master][type_id]:1 入库单类型
data[master][source_no]:no_121333 来源单号 (选填)
data[master][stock_up_status]:1二次质检状态 (选填)
data[master][remark]:备注 (选填)
data[master][status]:2 状态 (选填 不填默认1)
*
* 产品二维数组
data[goods][0][product_id]:16 产品id
data[goods][0][should_cnt]:133 应入数量
data[goods][0][real_cnt]:10 实入数量
data[goods][1][product_id]:18
data[goods][1][should_cnt]:10
data[goods][1][real_cnt]:15
*
* 或者参考yapi http://api.huaperfect.com/project/38/interface/api/1617
*
* @return array
* @throws
* Date: 2020/7/6
...
...
@@ -31,6 +51,39 @@ interface StoreServiceInterface
public
function
createWarehousing
(
array
$data
)
:
array
;
/**
* description:批量创建出库单
* author: fuyunnan
* [
'main' => [
'creator_id' => 1,
'warehouse_id' => 1,
'type' => 5,
],
'products' => [
[
'source_no' => 1,
'product_id' => 1,
'real_cnt' => 1
],
[
'source_no' => 1,
'product_id' => 1,
'real_cnt' => 1
]
]
]
*
* @param array $attributes 提交的数组 或参考yapi http://api.huaperfect.com/project/38/interface/api/6968
* @return array
* @throws
* Date: 2020/8/8
*/
public
function
createBatchWarehousing
(
array
$attributes
)
:
array
;
/**
* description:生产单结束获取统计单号值
* author: fuyunnan
...
...
@@ -101,7 +154,7 @@ interface StoreServiceInterface
/**
* description:通过产品id数组获取库存列表
* description:通过产品id数组获取库存列表
给订单系统使用
* author: fuyunnan
* @param array $ids 产品ids 数组
* @param int $wareId 仓库id
...
...
@@ -113,7 +166,7 @@ interface StoreServiceInterface
/**
* description:检查是否有库存,有就返回库存数量(有记录)
* description:检查是否有库存,有就返回库存数量(有记录)
给产品系统使用
* author: fuyunnan
* @param array $ids 仓库产品的id数组
* @return array
...
...
src/Shopify/ShopifyApp.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/18
* Time: 8:13
*/
namespace
Meibuyu\Micro\Shopify
;
use
Exception
;
use
Meibuyu\Micro\Shopify\lib\AbstractShopify
;
use
Meibuyu\Micro\Shopify\lib\Collect
;
use
Meibuyu\Micro\Shopify\lib\Collection
;
use
Meibuyu\Micro\Shopify\lib\CustomCollection
;
use
Meibuyu\Micro\Shopify\lib\Metafield
;
use
Meibuyu\Micro\Shopify\lib\SmartCollection
;
use
Meibuyu\Micro\Shopify\lib\Webhook
;
/**
* Class ShopifyApp
* @package Meibuyu\Shopify
*
* @property-read Webhook $Webhook
* @property-read Collect $Collect
* @property-read Collection $Collection
* @property-read CustomCollection $CustomCollection
* @property-read SmartCollection $SmartCollection
* @property-read Metafield $Metafield
*
* @method Webhook Webhook(integer $id = null)
* @method Collection Collection(integer $id = null)
* @method CustomCollection CustomCollection(integer $id = null)
* @method SmartCollection SmartCollection(integer $id = null)
* @method Metafield Metafield(integer $id = null)
*
*/
class
ShopifyApp
{
protected
$resources
=
[
'Webhook'
,
'Collect'
,
'Collection'
,
'CustomCollection'
,
'SmartCollection'
,
'Metafield'
,
];
protected
$childResources
=
array
(
'Fulfillment'
=>
'Order'
,
'FulfillmentEvent'
=>
'Fulfillment'
,
'OrderRisk'
=>
'Order'
,
'ProductImage'
=>
'Product'
,
'ProductVariant'
=>
'Product'
,
'DiscountCode'
=>
'PriceRule'
,
'Refund'
=>
'Order'
,
'Transaction'
=>
'Order'
,
);
public
$config
=
[];
public
$defaultApiVersion
=
'2020-07'
;
/**
* ShopifyApp constructor.
* @param array $config
*/
public
function
__construct
(
$config
)
{
$this
->
config
=
[
'api_version'
=>
$this
->
defaultApiVersion
];
foreach
(
$config
as
$key
=>
$value
)
{
$this
->
config
[
$key
]
=
$value
;
}
if
(
isset
(
$config
[
'shop_url'
]))
{
$this
->
setApiUrl
();
}
}
/**
* 返回AbstractShopify实例
* @param string $className 实现的类名
* @return AbstractShopify
* @throws Exception
*/
public
function
__get
(
$className
)
{
return
$this
->
$className
();
}
/**
* 返回AbstractShopify实例
* @param string $className 实现的类名
* @param $arguments
* @return AbstractShopify
* @throws Exception
*/
public
function
__call
(
$className
,
$arguments
)
{
if
(
!
in_array
(
$className
,
$this
->
resources
))
{
if
(
isset
(
$this
->
childResources
[
$className
]))
{
$message
=
"
$className
是属于
{
$this
->
childResources
[
$className
]
}
的子集, 无法直接访问"
;
}
else
{
$message
=
"未知类
$className
"
;
}
throw
new
Exception
(
$message
);
}
$resourceID
=
!
empty
(
$arguments
)
?
$arguments
[
0
]
:
null
;
$resourceClassName
=
__NAMESPACE__
.
"
\\
lib
\\
$className
"
;
return
new
$resourceClassName
(
$this
->
config
,
$resourceID
);
}
public
function
setApiUrl
()
{
$shopUrl
=
$this
->
config
[
'shop_url'
];
$shopUrl
=
preg_replace
(
'#^https?://|/$#'
,
''
,
$shopUrl
);
$apiVersion
=
$this
->
config
[
'api_version'
];
$this
->
config
[
'api_url'
]
=
"https://
$shopUrl
/admin/api/
$apiVersion
/"
;
}
}
src/Shopify/ShopifyFactory.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/19
* Time: 9:25
*/
namespace
Meibuyu\Micro\Shopify
;
use
Hyperf\Contract\ContainerInterface
;
class
ShopifyFactory
{
/**
* @var ContainerInterface
*/
private
$container
;
public
function
__construct
(
ContainerInterface
$container
)
{
$this
->
container
=
$container
;
}
public
function
create
(
array
$config
=
[])
:
ShopifyApp
{
if
(
method_exists
(
$this
->
container
,
'make'
))
{
// Create by DI for AOP.
return
$this
->
container
->
make
(
ShopifyApp
::
class
,
[
'config'
=>
$config
]);
}
return
new
ShopifyApp
(
$config
);
}
}
src/Shopify/lib/AbstractShopify.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/18
* Time: 8:18
*/
namespace
Meibuyu\Micro\Shopify\lib
;
use
Exception
;
use
Meibuyu\Micro\Tools\HttpRequestJson
;
use
Psr\Http\Message\ResponseInterface
;
abstract
class
AbstractShopify
{
/**
* 资源id
* @var int
*/
public
$id
=
null
;
protected
$httpHeaders
=
[];
protected
$resourceUrl
;
protected
$resourceKey
;
protected
$pluralizeKey
;
/**
* 无count方法
* @var boolean
*/
public
$countEnabled
=
true
;
// 子集资源
protected
$childResource
=
[];
// 自定义请求方法
protected
$customGetActions
=
[];
protected
$customPostActions
=
[];
protected
$customPutActions
=
[];
protected
$customDeleteActions
=
[];
private
$config
;
/**
* AbstractShopify constructor.
* @param $config
* @param null $id
* @param string $parentResourceUrl
* @throws Exception
*/
public
function
__construct
(
$config
,
$id
=
null
,
$parentResourceUrl
=
null
)
{
$this
->
config
=
$config
;
$this
->
id
=
$id
;
$this
->
pluralizeKey
=
$this
->
resourceKey
.
's'
;
$this
->
resourceUrl
=
(
$parentResourceUrl
?
"
$parentResourceUrl
/"
:
$config
[
'api_url'
])
.
$this
->
pluralizeKey
.
(
$this
->
id
?
"/
{
$this
->
id
}
"
:
''
);
if
(
isset
(
$config
[
'api_password'
]))
{
$this
->
httpHeaders
[
'X-Shopify-Access-Token'
]
=
$config
[
'api_password'
];
}
elseif
(
!
isset
(
$config
[
'api_password'
]))
{
throw
new
Exception
(
"请设置api_password值"
);
}
}
/**
* 调用子集资源
* @param $childName
* @return mixed
*/
public
function
__get
(
$childName
)
{
return
$this
->
$childName
();
}
/**
* 调用自定义方法
* @param $name
* @param $arguments
* @return mixed
* @throws Exception
*/
public
function
__call
(
$name
,
$arguments
)
{
if
(
ctype_upper
(
$name
[
0
]))
{
$childKey
=
array_search
(
$name
,
$this
->
childResource
);
if
(
$childKey
===
false
)
{
throw
new
Exception
(
"
$name
不属于
{
$this
->
getResourceName
()
}
"
);
}
$childClassName
=
!
is_numeric
(
$childKey
)
?
$childKey
:
$name
;
$childClass
=
__NAMESPACE__
.
"
\\
"
.
$childClassName
;
$resourceID
=
!
empty
(
$arguments
)
?
$arguments
[
0
]
:
null
;
return
new
$childClass
(
$this
->
config
,
$resourceID
,
$this
->
resourceUrl
);
}
else
{
$actionMaps
=
[
'post'
=>
'customPostActions'
,
'put'
=>
'customPutActions'
,
'get'
=>
'customGetActions'
,
'delete'
=>
'customDeleteActions'
,
];
//Get the array key for the action in the actions array
foreach
(
$actionMaps
as
$httpMethod
=>
$actionArrayKey
)
{
$actionKey
=
array_search
(
$name
,
$this
->
$actionArrayKey
);
if
(
$actionKey
!==
false
)
break
;
}
if
(
$actionKey
===
false
)
{
throw
new
Exception
(
"No action named
$name
is defined for "
.
$this
->
getResourceName
());
}
//If any associative key is given to the action, then it will be considered as the method name,
//otherwise the action name will be the method name
$customAction
=
!
is_numeric
(
$actionKey
)
?
$actionKey
:
$name
;
//Get the first argument if provided with the method call
$methodArgument
=
!
empty
(
$arguments
)
?
$arguments
[
0
]
:
[];
//Url parameters
$urlParams
=
[];
//Data body
$dataArray
=
[];
//Consider the argument as url parameters for get and delete request
//and data array for post and put request
if
(
$httpMethod
==
'post'
||
$httpMethod
==
'put'
)
{
$dataArray
=
$methodArgument
;
}
else
{
$urlParams
=
$methodArgument
;
}
$url
=
$this
->
generateUrl
(
$urlParams
,
null
,
$customAction
);
if
(
$httpMethod
==
'post'
||
$httpMethod
==
'put'
)
{
return
$this
->
$httpMethod
(
$dataArray
,
$url
,
false
);
}
else
{
return
$this
->
$httpMethod
(
$dataArray
,
$url
);
}
}
}
private
function
getResourceName
()
{
return
substr
(
get_called_class
(),
strrpos
(
get_called_class
(),
'\\'
)
+
1
);
}
public
function
generateUrl
(
$urlParams
=
[],
$id
=
null
,
$customAction
=
null
)
{
$resourceUrl
=
$this
->
resourceUrl
;
if
(
$id
)
{
if
(
$this
->
id
)
{
if
(
$id
!==
$this
->
id
)
{
$resourceUrl
=
str_replace
(
$this
->
id
,
$id
,
$this
->
resourceUrl
);
}
}
else
{
$resourceUrl
=
$this
->
resourceUrl
.
"/
$id
"
;
}
}
return
$resourceUrl
.
(
$customAction
?
"/
$customAction
"
:
''
)
.
'.json'
.
(
!
empty
(
$urlParams
)
?
'?'
.
http_build_query
(
$urlParams
)
:
''
);
}
/**
* @param array $urlParams
* @param null $url
* @param null $dataKey
* @return mixed
* @throws Exception
*/
public
function
get
(
$urlParams
=
[],
$url
=
null
,
$dataKey
=
null
)
{
if
(
!
$url
)
$url
=
$this
->
generateUrl
(
$urlParams
);
$response
=
HttpRequestJson
::
get
(
$url
,
$this
->
httpHeaders
);
if
(
!
$dataKey
)
$dataKey
=
$this
->
id
?
$this
->
resourceKey
:
$this
->
pluralizeKey
;
return
$this
->
processResponse
(
$response
,
$dataKey
);
}
/**
* 根据id获取一条数据
* @param $id
* @param array $urlParams
* @return mixed
* @throws Exception
*/
public
function
show
(
$id
,
$urlParams
=
[])
{
$url
=
$this
->
generateUrl
(
$urlParams
,
$id
);
$response
=
HttpRequestJson
::
get
(
$url
,
$this
->
httpHeaders
);
return
$this
->
processResponse
(
$response
,
$this
->
resourceKey
);
}
/**
* 获取数量
* @param array $urlParams
* @return mixed
* @throws Exception
*/
public
function
count
(
$urlParams
=
[])
{
if
(
!
$this
->
countEnabled
)
{
throw
new
Exception
(
"当前类
{
$this
->
getResourceName
()
}
不支持count()方法"
);
}
$url
=
$this
->
generateUrl
(
$urlParams
,
null
,
'count'
);
return
$this
->
get
([],
$url
,
'count'
);
}
/**
* @param $dataArray
* @param null $url
* @param bool $wrapData
* @return mixed
* @throws Exception
*/
public
function
post
(
$dataArray
,
$url
=
null
,
$wrapData
=
true
)
{
if
(
!
$url
)
$url
=
$this
->
generateUrl
();
if
(
$wrapData
&&
!
empty
(
$dataArray
))
$dataArray
=
$this
->
wrapData
(
$dataArray
);
$response
=
HttpRequestJson
::
post
(
$url
,
$dataArray
,
$this
->
httpHeaders
);
return
$this
->
processResponse
(
$response
,
$this
->
resourceKey
);
}
/**
* @param int|string $id
* @param $dataArray
* @param null $url
* @param bool $wrapData
* @return mixed
* @throws Exception
*/
public
function
put
(
$id
,
$dataArray
,
$url
=
null
,
$wrapData
=
true
)
{
if
(
!
$url
)
$url
=
$this
->
generateUrl
([],
$id
);
if
(
$wrapData
&&
!
empty
(
$dataArray
))
$dataArray
=
$this
->
wrapData
(
$dataArray
);
$response
=
HttpRequestJson
::
put
(
$url
,
$dataArray
,
$this
->
httpHeaders
);
return
$this
->
processResponse
(
$response
,
$this
->
resourceKey
);
}
/**
* @param int|string $id
* @param array $urlParams
* @param null $url
* @return mixed
* @throws Exception
*/
public
function
delete
(
$id
=
null
,
$urlParams
=
[],
$url
=
null
)
{
if
(
!
$url
)
$url
=
$this
->
generateUrl
(
$urlParams
,
$id
);
$response
=
HttpRequestJson
::
delete
(
$url
,
$this
->
httpHeaders
);
return
$this
->
processResponse
(
$response
);
}
protected
function
wrapData
(
$dataArray
,
$dataKey
=
null
)
{
if
(
!
$dataKey
)
$dataKey
=
$this
->
resourceKey
;
return
[
$dataKey
=>
$dataArray
];
}
protected
function
castString
(
$array
)
{
if
(
!
is_array
(
$array
))
return
(
string
)
$array
;
$string
=
''
;
$i
=
0
;
foreach
(
$array
as
$key
=>
$val
)
{
$string
.=
(
$i
===
$key
?
''
:
"
$key
- "
)
.
$this
->
castString
(
$val
)
.
', '
;
$i
++
;
}
$string
=
rtrim
(
$string
,
', '
);
return
$string
;
}
/**
* 处理响应
* @param ResponseInterface $response
* @param null $dataKey
* @return mixed
* @throws Exception
*/
public
function
processResponse
(
$response
,
$dataKey
=
null
)
{
$httpCode
=
$response
->
getStatusCode
();
$content
=
$response
->
getBody
()
->
getContents
();
$content
=
json_decode
(
$content
,
true
);
if
(
isset
(
$content
[
'errors'
]))
{
throw
new
Exception
(
$this
->
castString
(
$content
[
'errors'
]),
$httpCode
);
}
if
(
$dataKey
&&
isset
(
$content
[
$dataKey
]))
{
return
$content
[
$dataKey
];
}
else
{
return
$content
;
}
}
}
src/Shopify/lib/Collect.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/24
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
class
Collect
extends
AbstractShopify
{
protected
$resourceKey
=
'collect'
;
}
src/Shopify/lib/Collection.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/24
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
/**
* Class Collection
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read Metafield $Metafield
*
* @method Metafield Metafield(integer $id = null)
*/
class
Collection
extends
AbstractShopify
{
protected
$resourceKey
=
'collection'
;
protected
$childResource
=
[
'Metafield'
,
];
}
src/Shopify/lib/CustomCollection.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/22
* Time: 16:14
*/
namespace
Meibuyu\Micro\Shopify\lib
;
/**
* Class CustomCollection
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read Metafield $Metafield
*
* @method Metafield Metafield(integer $id = null)
*/
class
CustomCollection
extends
AbstractShopify
{
protected
$resourceKey
=
'custom_collection'
;
protected
$childResource
=
[
'Metafield'
,
];
}
src/Shopify/lib/Metafield.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/26
* Time: 15:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
class
Metafield
extends
AbstractShopify
{
protected
$resourceKey
=
'metafield'
;
}
src/Shopify/lib/SmartCollection.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/24
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
/**\
* Class SmartCollection
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read Metafield $Metafield
*
* @method Metafield Metafield(integer $id = null)
*/
class
SmartCollection
extends
AbstractShopify
{
protected
$resourceKey
=
'smart_collection'
;
protected
$childResource
=
[
'Metafield'
,
];
}
src/Shopify/lib/Webhook.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/18
* Time: 8:13
*/
namespace
Meibuyu\Micro\Shopify\lib
;
class
Webhook
extends
AbstractShopify
{
protected
$resourceKey
=
'webhook'
;
}
src/Tools/HttpRequestJson.php
0 → 100644
View file @
b240a5a6
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/8/19
* Time: 9:06
*/
namespace
Meibuyu\Micro\Tools
;
use
GuzzleHttp\Client
;
use
Psr\Http\Message\ResponseInterface
;
/**
* json格式请求(非协程)
* Class HttpRequestJson
* @package Meibuyu\Micro\Tools
*/
class
HttpRequestJson
{
/**
* get请求
* @param $url
* @param array $httpHeaders
* @return ResponseInterface
*/
public
static
function
get
(
$url
,
$httpHeaders
=
[])
{
$client
=
new
Client
();
return
$client
->
get
(
$url
,
[
'headers'
=>
$httpHeaders
]);
}
/**
* post请求
* @param $url
* @param $dataArray
* @param array $httpHeaders
* @return ResponseInterface
*/
public
static
function
post
(
$url
,
$dataArray
,
$httpHeaders
=
[])
{
$client
=
new
Client
();
return
$client
->
post
(
$url
,
[
'headers'
=>
$httpHeaders
,
'json'
=>
$dataArray
]);
}
/**
* put请求
* @param $url
* @param $dataArray
* @param array $httpHeaders
* @return ResponseInterface
*/
public
static
function
put
(
$url
,
$dataArray
,
$httpHeaders
=
[])
{
$client
=
new
Client
();
return
$client
->
put
(
$url
,
[
'headers'
=>
$httpHeaders
,
'json'
=>
$dataArray
]);
}
/**
* delete请求
* @param $url
* @param array $httpHeaders
* @return ResponseInterface
*/
public
static
function
delete
(
$url
,
$httpHeaders
=
[])
{
$client
=
new
Client
();
return
$client
->
delete
(
$url
,
[
'headers'
=>
$httpHeaders
]);
}
}
src/functions.php
View file @
b240a5a6
...
...
@@ -719,6 +719,29 @@ if (!function_exists('check_diff_val')) {
}
}
if
(
!
function_exists
(
'to_camel_case'
))
{
/**
* 下划线命名转驼峰命名
* 例:demo_function : demoFunction
* @param $dirSep 分隔符
* @param $str
* @return mixed|string
*/
function
to_camel_case
(
$dirSep
,
$str
)
{
$array
=
explode
(
$dirSep
,
$str
);
$result
=
$array
[
0
];
$len
=
count
(
$array
);
if
(
$len
>
1
)
{
for
(
$i
=
1
;
$i
<
$len
;
$i
++
)
{
$result
.=
ucfirst
(
$array
[
$i
]);
}
}
return
$result
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment