{"id":15045121,"url":"https://github.com/violines/rest-bundle","last_synced_at":"2025-10-25T00:31:39.550Z","repository":{"id":43294590,"uuid":"229759946","full_name":"violines/rest-bundle","owner":"violines","description":"Symfony Bundle to create REST APIs","archived":false,"fork":false,"pushed_at":"2022-03-09T13:08:06.000Z","size":485,"stargazers_count":35,"open_issues_count":2,"forks_count":1,"subscribers_count":4,"default_branch":"0.x","last_synced_at":"2025-01-31T04:32:07.023Z","etag":null,"topics":["bundle","json","json-api","rest","rest-api","symfony","symfony-bundle"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/violines.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-12-23T13:40:49.000Z","updated_at":"2023-10-29T16:53:02.000Z","dependencies_parsed_at":"2022-09-23T11:50:24.294Z","dependency_job_id":null,"html_url":"https://github.com/violines/rest-bundle","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/violines%2Frest-bundle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/violines%2Frest-bundle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/violines%2Frest-bundle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/violines%2Frest-bundle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/violines","download_url":"https://codeload.github.com/violines/rest-bundle/tar.gz/refs/heads/0.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238053514,"owners_count":19408699,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bundle","json","json-api","rest","rest-api","symfony","symfony-bundle"],"created_at":"2024-09-24T20:51:28.913Z","updated_at":"2025-10-25T00:31:39.240Z","avatar_url":"https://github.com/violines.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"## About\nviolines/rest-bundle is a Symfony Bundle to create REST APIs. It focusses on HTTP standards and integrates the symfony/serializer and symfony/validator.\n\n[![build](https://github.com/violines/rest-bundle/workflows/build/badge.svg)](https://github.com/violines/rest-bundle)\n[![Code Coverage](https://codecov.io/gh/violines/rest-bundle/branch/master/graph/badge.svg)](https://codecov.io/gh/violines/rest-bundle/)\n[![Mutation testing badge](https://img.shields.io/endpoint?style=flat\u0026url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fviolines%2Frest-bundle%2Fmaster)](https://dashboard.stryker-mutator.io/reports/github.com/violines/rest-bundle/master)\n[![type coverage](https://shepherd.dev/github/violines/rest-bundle/coverage.svg)](https://shepherd.dev/github/violines/rest-bundle)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=violines_rest-bundle\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=violines_rest-bundle)\n[![Software License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Wiki Docs](https://img.shields.io/badge/wiki-docs-B29700)](https://github.com/violines/rest-bundle/wiki)\n\n### Features\n* Request body or query string to object conversion\n* Response building from objects\n* Configurable content negotiation\n* Events to control symfony/serializer context\n* Integration of symfony/validator\n* Error Handling\n* Optional Logging\n\n### Compatible with...\n* Symfony 5.4 + 6\n* PHP 8 + 8.1\n\n### Designed for...\nmodern architectures that apply Domain Driven Design principles, hexagonal architecture or similar concepts.\n\n### Install\n```sh\ncomposer require violines/rest-bundle\n```\n\n### How does it work?\n1. Create any PHP class (Entity, DTO, Command, Query, etc) and add the `#[HttpApi]` attribute or `@HttpApi` annotation\n1. Use any property attributes/annotations from symfony/serializer or symfony/validator\n1. Declare this PHP class as type of a controller argument\n1. Return an instance of this PHP class in the controller\n\n### Show Case\nFind a sample of usage under: https://github.com/violines/rest-bundle-showcase.\n\n## Example\n\n```php\n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Entity;\n\n#[Violines\\RestBundle\\HttpApi\\HttpApi]\nfinal class Order\n{\n    public $amount;\n    public $articles;\n}\n\n// Or use Doctrine Annotations (requires separate install):\n// In order to use Annotations you have to install `doctrine/annotations` via `composer require doctrine/annotations`\n\n/**\n * @Violines\\RestBundle\\HttpApi\\HttpApi\n */\nfinal class Order {}\n```\n\n```php\n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controller;\n\nuse App\\Exception\\AuthenticationFailedException;\nuse App\\Entity\\Order;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\n\nclass OrderController\n{\n    /**\n     * @return Order[]\n     */\n    #[Route('/orders', methods: ['GET'], name: 'find_orders')]\n    public function findOrders(): array\n    {\n        return $this-\u003eorderRepository-\u003efindOrders();\n    }\n\n    #[Route('/order/{id}', methods: ['GET'], name: 'find_order')]\n    public function findOrder(int $id): Order\n    {\n        $order = $this-\u003eorderRepository-\u003efind($id);\n\n        if (null === $order) {\n            throw NotFoundException::id($id);\n        }\n\n        return $order;\n    }\n\n    /**\n     * @param Order[] $orders\n     */\n    #[Route('/orders/create', methods: ['POST'], name: 'create_orders')]\n    public function createOrders(Order ...$orders): Response\n    {\n        $this-\u003eorderRepository-\u003ecreateOrders($orders);\n\n        return new Response(null, Response::HTTP_CREATED);\n    }\n\n    #[Route('/order/create', methods: ['POST'], name: 'create_order')]\n    public function createOrder(Order $order): Response\n    {\n        $this-\u003eorderRepository-\u003ecreate($order);\n\n        return new Response(null, Response::HTTP_CREATED);\n    }\n}\n```\n\n### Wiki\nFor more details please check [violines/rest-bundle Wiki](https://github.com/violines/rest-bundle/wiki).\n\n## Development setup\n1. copy docker/.env.dist to docker/.env and adjust to your needs\n1. cd docker/\n1. pull latest image(s): docker-compose pull\n1. create the container(s): docker-compose up -d\n1. run tests with `docker-compose exec php80 composer run test`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviolines%2Frest-bundle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fviolines%2Frest-bundle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviolines%2Frest-bundle/lists"}