/vendor/league/fractal/src/TransformerAbstract.php
https://gitlab.com/Pasantias/pasantiasASLG · PHP · 276 lines · 107 code · 33 blank · 136 comment · 4 complexity · 7ef991d600abbdb1e82cc5b5e5b16d53 MD5 · raw file
- <?php
- /*
- * This file is part of the League\Fractal package.
- *
- * (c) Phil Sturgeon <me@philsturgeon.uk>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace League\Fractal;
- use League\Fractal\Resource\Collection;
- use League\Fractal\Resource\Item;
- use League\Fractal\Resource\NullResource;
- use League\Fractal\Resource\ResourceAbstract;
- /**
- * Transformer Abstract
- *
- * All Transformer classes should extend this to utilize the convenience methods
- * collection() and item(), and make the self::$availableIncludes property available.
- * Extend it and add a `transform()` method to transform any default or included data
- * into a basic array.
- */
- abstract class TransformerAbstract
- {
- /**
- * Resources that can be included if requested.
- *
- * @var array
- */
- protected $availableIncludes = [];
- /**
- * Include resources without needing it to be requested.
- *
- * @var array
- */
- protected $defaultIncludes = [];
- /**
- * The transformer should know about the current scope, so we can fetch relevant params.
- *
- * @var Scope
- */
- protected $currentScope;
- /**
- * Getter for availableIncludes.
- *
- * @return array
- */
- public function getAvailableIncludes()
- {
- return $this->availableIncludes;
- }
- /**
- * Getter for defaultIncludes.
- *
- * @return array
- */
- public function getDefaultIncludes()
- {
- return $this->defaultIncludes;
- }
- /**
- * Getter for currentScope.
- *
- * @return \League\Fractal\Scope
- */
- public function getCurrentScope()
- {
- return $this->currentScope;
- }
- /**
- * Figure out which includes we need.
- *
- * @internal
- *
- * @param Scope $scope
- *
- * @return array
- */
- private function figureOutWhichIncludes(Scope $scope)
- {
- $includes = $this->getDefaultIncludes();
- foreach ($this->getAvailableIncludes() as $include) {
- if ($scope->isRequested($include)) {
- $includes[] = $include;
- }
- }
- return $includes;
- }
- /**
- * This method is fired to loop through available includes, see if any of
- * them are requested and permitted for this scope.
- *
- * @internal
- *
- * @param Scope $scope
- * @param mixed $data
- *
- * @return array
- */
- public function processIncludedResources(Scope $scope, $data)
- {
- $includedData = [];
- $includes = $this->figureOutWhichIncludes($scope);
- foreach ($includes as $include) {
- $includedData = $this->includeResourceIfAvailable(
- $scope,
- $data,
- $includedData,
- $include
- );
- }
- return $includedData === [] ? false : $includedData;
- }
- /**
- * Include a resource only if it is available on the method.
- *
- * @internal
- *
- * @param Scope $scope
- * @param mixed $data
- * @param array $includedData
- * @param string $include
- *
- * @return array
- */
- private function includeResourceIfAvailable(
- Scope $scope,
- $data,
- $includedData,
- $include
- ) {
- if ($resource = $this->callIncludeMethod($scope, $include, $data)) {
- $childScope = $scope->embedChildScope($include, $resource);
- $includedData[$include] = $childScope->toArray();
- }
- return $includedData;
- }
- /**
- * Call Include Method.
- *
- * @internal
- *
- * @param Scope $scope
- * @param string $includeName
- * @param mixed $data
- *
- * @throws \Exception
- *
- * @return \League\Fractal\Resource\ResourceInterface
- */
- protected function callIncludeMethod(Scope $scope, $includeName, $data)
- {
- $scopeIdentifier = $scope->getIdentifier($includeName);
- $params = $scope->getManager()->getIncludeParams($scopeIdentifier);
- // Check if the method name actually exists
- $methodName = 'include'.str_replace(' ', '', ucwords(str_replace('_', ' ', str_replace('-', ' ', $includeName))));
- $resource = call_user_func([$this, $methodName], $data, $params);
- if ($resource === null) {
- return false;
- }
- if (! $resource instanceof ResourceAbstract) {
- throw new \Exception(sprintf(
- 'Invalid return value from %s::%s(). Expected %s, received %s.',
- __CLASS__,
- $methodName,
- 'League\Fractal\Resource\ResourceAbstract',
- gettype($resource)
- ));
- }
- return $resource;
- }
- /**
- * Setter for availableIncludes.
- *
- * @param array $availableIncludes
- *
- * @return $this
- */
- public function setAvailableIncludes($availableIncludes)
- {
- $this->availableIncludes = $availableIncludes;
- return $this;
- }
- /**
- * Setter for defaultIncludes.
- *
- * @param array $defaultIncludes
- *
- * @return $this
- */
- public function setDefaultIncludes($defaultIncludes)
- {
- $this->defaultIncludes = $defaultIncludes;
- return $this;
- }
- /**
- * Setter for currentScope.
- *
- * @param Scope $currentScope
- *
- * @return $this
- */
- public function setCurrentScope($currentScope)
- {
- $this->currentScope = $currentScope;
- return $this;
- }
- /**
- * Create a new item resource object.
- *
- * @param mixed $data
- * @param TransformerAbstract|callable $transformer
- * @param string $resourceKey
- *
- * @return Item
- */
- protected function item($data, $transformer, $resourceKey = null)
- {
- return new Item($data, $transformer, $resourceKey);
- }
- /**
- * Create a new collection resource object.
- *
- * @param mixed $data
- * @param TransformerAbstract|callable $transformer
- * @param string $resourceKey
- *
- * @return Collection
- */
- protected function collection($data, $transformer, $resourceKey = null)
- {
- return new Collection($data, $transformer, $resourceKey);
- }
- /**
- * Create a new null resource object.
- *
- * @return NullResource
- */
- protected function null()
- {
- return new NullResource();
- }
- }