core icon indicating copy to clipboard operation
core copied to clipboard

feat(laravel): laravel component

Open soyuka opened this issue 1 year ago • 6 comments

Laravel support in API Platform

TODO:

  • [x] Eloquent pagination
  • [ ] Eloquent filters
  • [x] Add a TestBundle inside src/Laravel to create functional tests
  • [ ] Add unit tests
  • [ ] Eloquent ApiProperties (cf https://github.com/api-platform/core/issues/5885)
  • [ ] providers/processors accessibles en middleware HTTP
  • [ ] integrate Eloquent relations
  • [ ] plug in GraphQl (check also our compatibility with https://lighthouse-php.com/ even though I think our implementation will work)
  • [ ] take ideas from https://github.com/api-platform/core/pull/4197 (relation persistence ? should we integrate eloquent bundle ?)

Note that this is still in development there are a few things missing (notably tests \o/).

To try this:

  1. create a laravel project:
composer create-project laravel/laravel my-api
  1. update your composer.json with:
    "repositories": [
        {
            "type": "path",
            "url": "/path/to/core/src/Laravel"
        }
    ]
}
  1. composer update, I added #[ApiResource] on the model and change the Exception\Handler to use ApiPlatform\Laravel\Exception\Handler.

There are many things left tbd (filters, pagination, graphql etc).

soyuka avatar Oct 12 '23 13:10 soyuka

not working for the moment. I haven't package api-platform who install after create project laravel and change composer.json

kilwir76 avatar Oct 13 '23 22:10 kilwir76

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jan 06 '24 14:01 stale[bot]

Is there a specific way that we need to add serialization support for other types other than jsonld? I tried both jsonapi and jsonhal and get the following trace:

[2024-04-26 20:34:38] local.ERROR: Serialization for the format "jsonapi" is not supported. {"exception":"[object] (Symfony\\Component\\Serializer\\Exception\\UnsupportedFormatException(code: 0): Serialization for the format \"jsonapi\" is not supported. at /Users/steve/Herd/laravel-api-platform/vendor/symfony/serializer/Serializer.php:134)
[stacktrace]
#0 /Users/steve/Herd/core/src/State/Processor/SerializeProcessor.php(65): Symfony\\Component\\Serializer\\Serializer->serialize(Object(ApiPlatform\\Laravel\\Eloquent\\Paginator), 'jsonapi', Array)
#1 /Users/steve/Herd/core/src/State/Processor/WriteProcessor.php(42): ApiPlatform\\State\\Processor\\SerializeProcessor->process(Object(ApiPlatform\\Laravel\\Eloquent\\Paginator), Object(ApiPlatform\\Metadata\\GetCollection), Array, Array)
#2 /Users/steve/Herd/core/src/Hydra/State/HydraLinkProcessor.php(52): ApiPlatform\\State\\Processor\\WriteProcessor->process(Object(ApiPlatform\\Laravel\\Eloquent\\Paginator), Object(ApiPlatform\\Metadata\\GetCollection), Array, Array)
#3 /Users/steve/Herd/core/src/Laravel/Controller/ApiPlatformController.php(90): ApiPlatform\\Hydra\\State\\HydraLinkProcessor->process(Object(ApiPlatform\\Laravel\\Eloquent\\Paginator), Object(ApiPlatform\\Metadata\\GetCollection), Array, Array)
#4 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): ApiPlatform\\Laravel\\Controller\\ApiPlatformController->__invoke(Object(Illuminate\\Http\\Request))
#5 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('__invoke', Array)
#6 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(ApiPlatform\\Laravel\\Controller\\ApiPlatformController), '__invoke')
#7 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
#8 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
#9 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#10 /Users/steve/Herd/core/src/Laravel/ApiPlatformMiddleware.php(38): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#11 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): ApiPlatform\\Laravel\\ApiPlatformMiddleware->handle(Object(Illuminate\\Http\\Request), Object(Closure), '_api_/api/books...')
#12 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#13 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#14 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#15 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#16 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#17 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#18 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#19 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#20 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#21 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#22 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#23 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#24 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#25 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#27 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#28 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#29 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#30 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#31 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#32 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#33 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#34 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#35 /Users/steve/Herd/laravel-api-platform/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#36 /Users/steve/Herd/laravel-api-platform/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#37 /Applications/Herd.app/Contents/Resources/valet/server.php(151): require('/Users/steve/He...')
#38 {main}
"} 

JustSteveKing avatar Apr 26 '24 20:04 JustSteveKing

https://github.com/api-platform/core/pull/5882/files#diff-1f34d8685c9bbcc2037ef47c41cb6dac916a0fe6fc06e2047b9635e35fa13527R396 it's missing jsonapi/hal normalizers indeed.

soyuka avatar Apr 27 '24 20:04 soyuka

https://github.com/api-platform/core/pull/5882/files#diff-1f34d8685c9bbcc2037ef47c41cb6dac916a0fe6fc06e2047b9635e35fa13527R396 it's missing jsonapi/hal normalizers indeed.

I assume you know how to do this? I am still getting up to speed with some of these things!

JustSteveKing avatar Apr 30 '24 20:04 JustSteveKing

Indeed, I plan to continue working on this mid-june.

soyuka avatar May 24 '24 07:05 soyuka

merging now that the CI is all green, it's still missing some features (security / filters) and it'll be easier to review afterwards.

soyuka avatar Jun 25 '24 14:06 soyuka