public function testGetIdentifier() { $manager = new Manager(); $resource = new Item(array('name' => 'Larry Ullman'), function () { }); $scope = new Scope($manager, $resource, 'book'); $this->assertEquals('book', $scope->getIdentifier()); $childScope = $scope->embedChildScope('author', $resource); $this->assertEquals('book.author', $childScope->getIdentifier()); $grandChildScope = $childScope->embedChildScope('profile', $resource); $this->assertEquals('book.author.profile', $grandChildScope->getIdentifier()); }
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(array($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; }
/** * Call method for retrieving a relation. This method overrides Fractal's own * [callIncludeMethod] method to load relations directly from your models. * * @param Scope $scope * @param string $includeName * @param mixed $data * @return \League\Fractal\Resource\ResourceInterface|bool * @throws \Exception */ protected function callIncludeMethod(Scope $scope, $includeName, $data) { if ($includeName === 'pivot') { return $this->includePivot($data->{$includeName}); } $params = $scope->getManager()->getIncludeParams($scope->getIdentifier($includeName)); if (method_exists($this, $includeName)) { $include = call_user_func([$this, $includeName], $data, $params); if ($include instanceof ResourceAbstract) { return $include; } return app(Responder::class)->transform($include)->getResource(); } else { return app(Responder::class)->transform($data->{$includeName})->getResource(); } }