/** * Fire the main transformer. * * @internal * * @param TransformerAbstract|callable $transformer * @param mixed $data * * @return array * @throws EntityNotFoundException */ protected function fireTransformer($transformer, $data) { $this->transformer = $transformer; $includedData = []; $transformedData = []; $dataTransformer = []; if ($this->getManager()->getSerializer() instanceof DataHydraSerializer && !empty($data)) { $transformedData['@id'] = $this->getGenerateRoute($data); } if ($this->getManager()->getSerializer() instanceof DataHydraSerializer && !empty($this->getEntityName())) { $transformedData['@type'] = $this->getEntityName(); } try { $dataTransformer = is_callable($transformer) ? call_user_func($transformer, $data) : $transformer->transform($data); } catch (EntityNotFoundException $e) { if ($this->resource instanceof Item && !$this->parent instanceof Scope) { throw new EntityNotFoundException(); } } $transformedData = array_merge($transformedData, $dataTransformer); if ($this->getManager()->getGroupsContextChainer() instanceof GroupsContextChainer) { $transformedData = $this->getManager()->getGroupsContextChainer()->serialize($this->transformer->getCurrentResourceKey(), $transformedData, $this->getDunglasResource()->getVersion()); } if ($this->transformerHasIncludes($transformer)) { $includedData = $this->fireIncludedTransformers($transformer, $data); // If the serializer does not want the includes to be side-loaded then // the included data must be merged with the transformed data. if (!$this->manager->getSerializer()->sideloadIncludes() && is_array($includedData)) { $transformedData = array_merge($transformedData, $includedData); } } return array($transformedData, $includedData); }
/** * @param TransformerAbstract $transformer * @param $object * @param string $apiVersion * * @return Scope */ protected function initScope(TransformerAbstract $transformer, $object, $apiVersion = "v2") { $resource = new Item($object, $transformer); $scope = $this->fractal->createData($resource); $shortName = $transformer->getCurrentResourceKey(); if (!($dunglasResource = $this->resourceCollection->getResourceForShortNameWithVersion(ucfirst($shortName), $apiVersion))) { throw new \InvalidArgumentException(sprintf('The resource "%s" cannot be found.', $shortName)); } $scope->setDunglasResource($dunglasResource); return $scope; }