8000 [12.x] Add resource helper functions to Model/Collections by TimKunze96 · Pull Request #55107 · laravel/framework · GitHub
[go: up one dir, main page]

Skip to content

[12.x] Add resource helper functions to Model/Collections #55107

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
adjust tests and logic
  • Loading branch information
taylorotwell committed Apr 2, 2025
commit 9e9f8a64fbb76f56fbeab7cfaa7b68ff7a389a76
39 changes: 18 additions & 21 deletions src/Illuminate/Http/Resources/TransformsToResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,45 +34,42 @@ public function toResource(?string $resourceClass = null): JsonResource
*/
protected function guessResource(): JsonResource
{
$resourceClass = static::guessResourceName();

throw_unless(
is_string($resourceClass) && class_exists($resourceClass),
LogicException::class, sprintf('Failed to find resource class for model [%s].', get_class($this))
);
foreach (static::guessResourceName() as $resourceClass) {
if (is_string($resourceClass) && class_exists($resourceClass)) {
return $resourceClass::make($this);
}
}

return $resourceClass::make($this);
throw new LogicException(sprintf('Failed to find resource class for model [%s].', get_class($this)));
}

/**
* Guess the resource class name for the model.
*
* @return class-string<JsonResource>
* @return array<class-string<JsonResource>>
*/
public static function guessResourceName(): string
public static function guessResourceName(): array
{
$modelClass = static::class;

if (! Str::contains($modelClass, '\\Models\\')) {
return false;
return [];
}

// Get everything after the "Models" namespace...
$relativeNamespace = Str::after($modelClass, '\\Models\\');
$relativeNamespace = str_replace('\\'.class_basename($modelClass), '', $relativeNamespace);

if ($relativeNamespace === class_basename($modelClass)) {
$relativeNamespace = '';
}

// Get the root namespace (everything before "Models")...
$rootNamespace = Str::before($modelClass, '\\Models');
$relativeNamespace = Str::contains($relativeNamespace, '\\')
? Str::before($relativeNamespace, '\\'.class_basename($modelClass))
: '';

return sprintf(
'%s\\Http\\Resources\\%s%sResource',
$rootNamespace,
$relativeNamespace ? $relativeNamespace.'\\' : '',
$potentialResource = sprintf(
'%s\\Http\\Resources\\%s%s',
Str::before($modelClass, '\\Models'),
strlen($relativeNamespace) > 0 ? $relativeNamespace.'\\' : '',
class_basename($modelClass)
);

return [$potentialResource.'Resource', $potentialResource];
}
}
10 changes: 6 additions & 4 deletions src/Illuminate/Http/Resources/TransformsToResourceCollection.php
A397
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@ protected function guessResourceCollection(): ResourceCollection

throw_unless(method_exists($className, 'guessResourceName'), LogicException::class, sprintf('Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.', $className));

$resourceClass = $className::guessResourceName();

throw_unless(class_exists($resourceClass), LogicException::class, sprintf('Failed to find resource class for model [%s].', $className));
foreach ($className::guessResourceName() as $resourceClass) {
if (is_string($resourceClass) && class_exists($resourceClass)) {
return $resourceClass::collection($this);
}
}

return $resourceClass::collection($this);
throw new LogicException(sprintf('Failed to find resource class for model [%s].', $className));
}
}
5 changes: 4 additions & 1 deletion tests/Database/DatabaseEloquentResourceModelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ class_alias(EloquentResourceTestJsonResource::class, 'Illuminate\Tests\Database\
public function testItCanGuessResourceName()
{
$model = new EloquentResourceTestResourceModel();
$this->assertEquals('Illuminate\Tests\Database\Fixtures\Http\Resources\EloquentResourceTestResourceModelResource', $model::guessResourceName());
$this->assertEquals([
'Illuminate\Tests\Database\Fixtures\Http\Resources\EloquentResourceTestResourceModelResource',
'Illuminate\Tests\Database\Fixtures\Http\Resources\EloquentResourceTestResourceModel'
], $model::guessResourceName());
}
}

Expand Down
Loading
0