diff options
Diffstat (limited to 'vendor/stripe/stripe-php/lib/ApiResource.php')
-rw-r--r-- | vendor/stripe/stripe-php/lib/ApiResource.php | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/vendor/stripe/stripe-php/lib/ApiResource.php b/vendor/stripe/stripe-php/lib/ApiResource.php new file mode 100644 index 0000000..521010b --- /dev/null +++ b/vendor/stripe/stripe-php/lib/ApiResource.php @@ -0,0 +1,120 @@ +<?php + +namespace Stripe; + +/** + * Class ApiResource. + */ +abstract class ApiResource extends StripeObject +{ + use ApiOperations\Request; + + /** + * @return \Stripe\Util\Set A list of fields that can be their own type of + * API resource (say a nested card under an account for example), and if + * that resource is set, it should be transmitted to the API on a create or + * update. Doing so is not the default behavior because API resources + * should normally be persisted on their own RESTful endpoints. + */ + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set(); + } + + return $savedNestedResources; + } + + /** + * @var bool A flag that can be set a behavior that will cause this + * resource to be encoded and sent up along with an update of its parent + * resource. This is usually not desirable because resources are updated + * individually on their own endpoints, but there are certain cases, + * replacing a customer's source for example, where this is allowed. + */ + public $saveWithParent = false; + + public function __set($k, $v) + { + parent::__set($k, $v); + $v = $this->{$k}; + if ((static::getSavedNestedResources()->includes($k)) + && ($v instanceof ApiResource)) { + $v->saveWithParent = true; + } + } + + /** + * @throws Exception\ApiErrorException + * + * @return ApiResource the refreshed resource + */ + public function refresh() + { + $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl()); + $url = $this->instanceUrl(); + + list($response, $this->_opts->apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions, + $this->_opts->headers + ); + $this->setLastResponse($response); + $this->refreshFrom($response->json, $this->_opts); + + return $this; + } + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * @return string the endpoint URL for the given class + */ + public static function classUrl() + { + // Replace dots with slashes for namespaced resources, e.g. if the object's name is + // "foo.bar", then its URL will be "/v1/foo/bars". + $base = \str_replace('.', '/', static::OBJECT_NAME); + + return "/v1/{$base}s"; + } + + /** + * @param null|string $id the ID of the resource + * + * @throws Exception\UnexpectedValueException if $id is null + * + * @return string the instance endpoint URL for the given class + */ + public static function resourceUrl($id) + { + if (null === $id) { + $class = static::class; + $message = 'Could not determine which URL to request: ' + . "{$class} instance has invalid ID: {$id}"; + + throw new Exception\UnexpectedValueException($message); + } + $id = Util\Util::utf8($id); + $base = static::classUrl(); + $extn = \urlencode($id); + + return "{$base}/{$extn}"; + } + + /** + * @return string the full API URL for this API resource + */ + public function instanceUrl() + { + return static::resourceUrl($this['id']); + } +} |