Skip to content

Error with Laravel and DTO #6717

@noweh

Description

@noweh

API Platform version(s) affected: api-platform/laravel 4.0.3

Description
When attempting to use Data Transfer Objects (DTOs) with Laravel, as described in the documentation, I encounter a 404 error on the newly added route:

{
  "@context": "/api/contexts/Error",
  "@id": "/api/errors/404.jsonld",
  "@type": "hydra:Error",
  "trace": [
    {
      "file": "XXXX\\project\\vendor\\api-platform\\laravel\\State\\SwaggerUiProvider.php",
      "line": 57,
      "function": "provide",
      "class": "ApiPlatform\\State\\Provider\\ReadProvider",
      "type": "->"
    },
   ....
}

How to reproduce

  1. Create a DTO resource class:
<?php

namespace App\ApiResource;

use ApiPlatform\Metadata\Get;
use App\State\CatProvider;

#[Get(uriTemplate: '/cats/{id}', provider: CatProvider::class)]
class Cat
{
    public string $id;
    public string $name;
    public int $age;
}
  1. Configure api-platform.php to include the DTO resource path:
// config/api-platform.php

// ...
return [
    'resources' => [
        app_path('ApiResource'),
        app_path('Models'),
    ],

    // ...
];
  1. Implement the CatProvider class that fetches data from the model:
<?php

namespace App\State;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Models\Animal as AnimalModel;

final class CatProvider implements ProviderInterface
{
    public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
    {
        $animal = AnimalModel::find($uriVariables['id']);

        return new AnimalModel([
            'id' => $animal->id,
            'name' => $animal->name,
            'age' => $animal->age
        ]);
    }
}
  1. Register the provider in the AppServiceProvider:
<?php

namespace App\Providers;

use App\State\CatProvider;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Foundation\Application;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->app->singleton(CatProvider::class, function (Application $app) {
            return new CatProvider();
        });

        $this->app->tag([CatProvider::class], 'provider');
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        //
    }
}

Expected Behavior
The GET /cats/{id} route should return the correct data for the Cat resource using the CatProvider.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions