Commit 32696c91 authored by 王源's avatar 王源
Browse files

[功能]添加shopify集合相关类文件

parent 0c883be6
Loading
Loading
Loading
Loading
+56 −5
Original line number Diff line number Diff line
@@ -8,7 +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;

/**
@@ -16,20 +22,46 @@ use Meibuyu\Micro\Shopify\lib\Webhook;
 * @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';

    public $timeAllowedForEachApiCall = .5;

    /**
     * ShopifyApp constructor.
     * @param array $config
@@ -51,15 +83,34 @@ class ShopifyApp
     * 返回AbstractShopify实例
     * @param string $className 实现的类名
     * @return AbstractShopify
     * @throws \Exception
     * @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)) {
            throw new \Exception("未知方法 $className");
            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);
        return new $resourceClassName($this->config, $resourceID);
    }

    public function setApiUrl()
+100 −69
Original line number Diff line number Diff line
@@ -8,16 +8,22 @@

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;

@@ -27,64 +33,80 @@ abstract class AbstractShopify
     */
    public $countEnabled = true;

    /**
     * List of custom GET / POST / PUT / DELETE actions
     *
     * Custom actions can be used without calling the get(), post(), put(), delete() methods directly
     * @example: ['enable', 'disable', 'remove','default' => 'makeDefault']
     * Methods can be called like enable(), disable(), remove(), makeDefault() etc.
     * If any array item has an associative key => value pair, value will be considered as the method name
     * and key will be the associated path to be used with the action.
     *
     * @var array $customGetActions
     * @var array $customPostActions
     * @var array $customPutActions
     * @var array $customDeleteActions
     */
    // 子集资源
    protected $childResource = [];

    // 自定义请求方法
    protected $customGetActions = [];
    protected $customPostActions = [];
    protected $customPutActions = [];
    protected $customDeleteActions = [];

    private $config;

    /**
     * AbstractShopify constructor.
     * @param $config
     * @throws \Exception
     * @param null $id
     * @param string $parentResourceUrl
     * @throws Exception
     */
    public function __construct($config)
    public function __construct($config, $id = null, $parentResourceUrl = null)
    {
        $this->config = $config;
        $this->id = $id;
        $this->pluralizeKey = $this->resourceKey . 's';
        $this->resourceUrl = $config['api_url'] . $this->pluralizeKey;
        $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值");
            throw new Exception("请设置api_password值");
        }
    }

    /**
     * 调用子集资源
     * @param $childName
     * @return mixed
     */
    public function __get($childName)
    {
        return $this->$childName();
    }

    /**
     * 调用自定义方法
     * @param $name
     * @param $arguments
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function __call($name, $arguments)
    {
        $actionMaps = array(
        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());
                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
@@ -109,6 +131,7 @@ abstract class AbstractShopify
                return $this->$httpMethod($dataArray, $url);
            }
        }
    }

    private function getResourceName()
    {
@@ -117,7 +140,17 @@ abstract class AbstractShopify

    public function generateUrl($urlParams = [], $id = null, $customAction = null)
    {
        return $this->resourceUrl . ($id ? "/$id" : '') . ($customAction ? "/$customAction" : '') . '.json' . (!empty($urlParams) ? '?' . http_build_query($urlParams) : '');
        $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) : '');
    }

    /**
@@ -125,15 +158,13 @@ abstract class AbstractShopify
     * @param null $url
     * @param null $dataKey
     * @return mixed
     * @throws \Exception
     * @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->pluralizeKey;
        if (!$dataKey) $dataKey = $this->id ? $this->resourceKey : $this->pluralizeKey;
        return $this->processResponse($response, $dataKey);
    }

@@ -142,7 +173,7 @@ abstract class AbstractShopify
     * @param $id
     * @param array $urlParams
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function show($id, $urlParams = [])
    {
@@ -155,12 +186,12 @@ abstract class AbstractShopify
     * 获取数量
     * @param array $urlParams
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function count($urlParams = [])
    {
        if (!$this->countEnabled) {
            throw new \Exception("当前类{$this->getResourceName()}不支持count()方法");
            throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
        }
        $url = $this->generateUrl($urlParams, null, 'count');
        return $this->get([], $url, 'count');
@@ -171,7 +202,7 @@ abstract class AbstractShopify
     * @param null $url
     * @param bool $wrapData
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function post($dataArray, $url = null, $wrapData = true)
    {
@@ -187,7 +218,7 @@ abstract class AbstractShopify
     * @param null $url
     * @param bool $wrapData
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function put($id, $dataArray, $url = null, $wrapData = true)
    {
@@ -202,9 +233,9 @@ abstract class AbstractShopify
     * @param array $urlParams
     * @param null $url
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function delete($id, $urlParams = [], $url = null)
    public function delete($id = null, $urlParams = [], $url = null)
    {
        if (!$url) $url = $this->generateUrl($urlParams, $id);
        $response = HttpRequestJson::delete($url, $this->httpHeaders);
@@ -214,7 +245,7 @@ abstract class AbstractShopify
    protected function wrapData($dataArray, $dataKey = null)
    {
        if (!$dataKey) $dataKey = $this->resourceKey;
        return array($dataKey => $dataArray);
        return [$dataKey => $dataArray];
    }

    protected function castString($array)
@@ -235,7 +266,7 @@ abstract class AbstractShopify
     * @param ResponseInterface $response
     * @param null $dataKey
     * @return mixed
     * @throws \Exception
     * @throws Exception
     */
    public function processResponse($response, $dataKey = null)
    {
@@ -244,7 +275,7 @@ abstract class AbstractShopify
        $content = json_decode($content, true);

        if (isset($content['errors'])) {
            throw new \Exception($this->castString($content['errors']), $httpCode);
            throw new Exception($this->castString($content['errors']), $httpCode);
        }
        if ($dataKey && isset($content[$dataKey])) {
            return $content[$dataKey];
+16 −0
Original line number Diff line number Diff line
<?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';

}
+28 −0
Original line number Diff line number Diff line
<?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',
    ];

}
+28 −0
Original line number Diff line number Diff line
<?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',
    ];

}
Loading