{"id":41922725,"url":"https://github.com/rodrigoaramburu/php-json-server","last_synced_at":"2026-01-25T17:03:45.830Z","repository":{"id":52304461,"uuid":"520905171","full_name":"rodrigoaramburu/php-json-server","owner":"rodrigoaramburu","description":"um servidor de api fake","archived":false,"fork":false,"pushed_at":"2022-12-29T14:05:03.000Z","size":151,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-23T00:51:11.732Z","etag":null,"topics":["api","api-faker","json","php"],"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/rodrigoaramburu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-08-03T14:04:37.000Z","updated_at":"2022-08-24T13:47:45.000Z","dependencies_parsed_at":"2023-01-31T09:01:14.555Z","dependency_job_id":null,"html_url":"https://github.com/rodrigoaramburu/php-json-server","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/rodrigoaramburu/php-json-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodrigoaramburu%2Fphp-json-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodrigoaramburu%2Fphp-json-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodrigoaramburu%2Fphp-json-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodrigoaramburu%2Fphp-json-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodrigoaramburu","download_url":"https://codeload.github.com/rodrigoaramburu/php-json-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodrigoaramburu%2Fphp-json-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28755561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T16:32:25.380Z","status":"ssl_error","status_checked_at":"2026-01-25T16:32:09.189Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["api","api-faker","json","php"],"created_at":"2026-01-25T17:03:45.748Z","updated_at":"2026-01-25T17:03:45.824Z","avatar_url":"https://github.com/rodrigoaramburu.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PHP JSON Server\n\nPHP JSON Server é uma biblioteca simples para fornecer uma API REST em poucos minutos para ser utilizada em testes de _front-end_ por exemplo. \n\nEla pode rodar através do servidor _build-in_ do PHP ou ser integrada a um _framework_ com bastante facilidade. Também possui um CLI para iniciar um servidor de maneira rápida e gerar os dados da API.\n\n__* NÃO DEVE SER UTILIZADO EM PRODUÇÃO__\n\nInpirada na biblioteca [Zlob/php-json-server](https://github.com/Zlob/php-json-server)\n\n## Instalação\n\nVia composer `composer require rodrigoaramburu/php-json-server`.\n\nCriamos um arquivo `index.php` com o seguinte código.\n\n```php\n$server = new Server([\n    'database-file' =\u003e __DIR__.'/database.json',\n]);\n\n$path = $_SERVER['REQUEST_URI'];\n$body = file_get_contents('php://input');\n$headers = getallheaders();\n$response = $server-\u003ehandle($_SERVER['REQUEST_METHOD'], $path, $body, $headers);\n\n$server-\u003esend($response);\n```\n\nAo criar o `Server` passamos o caminho para o _json_ de dados da API. Nele definimos os dados iniciais e quais coleções a API vai ter. Veja um exemplo de `database.json`\n\n```\n{\n    \"embed-resources\": {\n        \"posts\" : [\"comments\"]\n    },\n    \"posts\": [\n        {\n            \"id\": 1,\n            \"title\": \"Lorem ipsum dolor sit amet\",\n            \"author\": \"Rodrigo\",\n            \"content\": \"Nunc volutpat ipsum eget sapien ornare...\"\n        },\n        {\n            \"id\": 2,\n            \"title\": \"Duis quis arcu mi\",\n            \"author\": \"Rodrigo\",\n            \"content\": \"Suspendisse auctor dolor risus, vel posuere libero...\"\n        }\n    ],\n    \"comments\": [\n        {\n            \"id\": 1,\n            \"post_id\": 1,\n            \"comment\": \"Pellentesque id orci sodales, dignissim massa vel\"\n        },\n        {\n            \"id\": 2,\n            \"post_id\": 2,\n            \"comment\": \"Maecenas elit dui, venenatis ut erat vitae\"\n        },\n        {\n            \"id\": 3,\n            \"post_id\": 1,\n            \"comment\": \"Quisque velit tellus, tempus vitae condimentum nec\"\n        }\n    ]\n}\n```\n\nCada propriedade do _JSON_ representa uma coleção sendo seu valor um _array_ de objetos contidos na coleção. Podemos ligar um objeto de uma coleção com de outra coleção com uma \"chave estrangeira\" com o formato `\u003ccoleção no singular\u003e_id`, isto irá fazer com que ao ser recuperada o campo de \"chave estrangeira\" será substituido pelo resource com o id especificado. \n\nPara carregar todos um resource juntamente com todos os outros que tem  que tem uma chave estrangeira para ele adicionamos esta relação a entrada _embed-resources_ do arquivo de dados.\n\nCom o _JSON_ acima a API irá nos fornecer as seguintes rotas.\n\nMethod | Url\n-------|------------\nGET    | /posts\nGET    | /posts/1\nGET    | /posts/comments\nGET    | /posts/1/comments\nPOST   | /posts\nPOST   | /posts/1/comments\nPUT    | /posts/1\nPUT    | /posts/1/comments/3\nDELETE | /posts/1\nDELETE | /posts/1/comments/3\n\n\nCom o `database.json` e o `index.php` podemos rodar a API com o servidor _build-in_ do _PHP_.\n\n```shell\nphp -S localhost:8000 index.php\n```\n\nTambém podemos integra-lo facilmente com outros _frameworks_. Veja um exemplo utilizando o _**Slim**_.\n\n```php\nuse DI\\Container;\nuse JsonServer\\Server;\nuse Slim\\Factory\\AppFactory;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n$container = new Container();\nAppFactory::setContainer($container);\n$app = AppFactory::create();\n\n$server = new Server([\n    'database-file' =\u003e __DIR__.'/database.json',\n]);\n\n$app-\u003eany('/api/{path:.*}' , function(RequestInterface $request, ResponseInterface $response, $args) use($server){\n     \n    $path = '/'.$args['path'];\n    $body = (string) $request-\u003egetBody();\n    $headers = $request-\u003egetHeaders();\n    $response = $server-\u003ehandle($request-\u003egetMethod(), $path, $body, $headers);\n    \n    return $response;\n});\n \n$app-\u003erun();\n```\n\n* Obs.: neste caso as rotas da api serão precedidas por `/api`\n\nComo o retorno do método `handle` é um objeto da interface `Psr\\Http\\Message\\ResponseInterface` basta retornar para o _Slim_ construir a resposta.\n\n## Middlewares\n\nO servidor permite a utilização de _middlewares_, para isso basta estender a classe abstrata `JsonServer\\Middlewares\\Middleware` implementando o método `public function process(RequestInterface $request, Handler $handler): ResponseInterface;`\n\n```php \nuse JsonServer\\Middlewares\\Handler;\nuse JsonServer\\Middlewares\\Middleware;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\n\nclass ExampleMiddleware extends Middleware\n{\n    public function process(ServerRequestInterface $request, Handler $handler): ResponseInterface\n    {\n        //antes de ser processado\n        $authToken = $request-\u003egetHeader(\"Authorization\");\n        \n        $response = $handler-\u003ehandle($request);\n        \n        // após ser processado \n        $response = $response-\u003ewithHeader('Content-Type','application/json');\n        return $response;\n    }\n}\n```\n\nE depois adicionar ao `$server`:\n\n```php\n$server-\u003eaddMiddleware(new ExampleMiddleware());\n````\n\n### Middleware Rota Estática\n\nPodemos criar rotas estáticas utilizando o middleware `StaticMiddleware`, ele recebe no construtor um _array_ ou o caminho para um arquivo _json_ com as rotas.\n\n```php\n$staticRoutes = new StaticMiddleware([\n    \"/static/route\" =\u003e [\n        \"GET\" =\u003e [\n            \"body\" =\u003e \"{\\\"message\\\": \\\"Uma resposta GET para o cliente \\\"}\",\n            \"statusCode\" =\u003e 200,\n            \"headers\" =\u003e [\n                \"Content-Type\" =\u003e \"application/json\"\n            ]\n        ],\n        \"POST\" =\u003e [\n            \"body\" =\u003e \"{\\\"message\\\": \\\"Uma resposta POST para o cliente\\\"}\",\n            \"statusCode\" =\u003e 201,\n            \"headers\" =\u003e [\n                \"Content-Type\" =\u003e \"application/json\"\n            ]\n        ],\n    ]\n]);\n$server-\u003eaddMiddleware($staticRoutes);\n```\n\nEm vez de passar o array podemos passar um json com as configurações das rotas em um arquivo _json_ como `static.json`.\n\n```json\n{\n    \"/static/route\": {\n        \"GET\": {\n            \"body\": \"{\\\"message\\\": \\\"Uma resposta GET para o cliente \\\"}\",\n            \"statusCode\": 200,\n            \"headers\": {\n                \"Content-Type\": \"application/json\"\n            }\n        },\n        \"POST\": {\n            \"body\": \"{\\\"message\\\": \\\"Uma resposta POST para o cliente\\\"}\",\n            \"statusCode\": 201,\n            \"headers\": {\n                \"Content-Type\": \"application/json\"\n            }\n        }\n    }\n}\n```\n\nE adicionamos passamos seu caminho ao _middleware_ \n```php\n$staticRoutes = new StaticMiddleware(__DIR__.'/static.json');\n$server-\u003eaddMiddleware($staticRoutes);\n```\n\n## Filtros e Ordenação\n\nPodemos filtrar um recurso por campo passando o campo e o valor como _query param_:\n\n```\nhttp://localhost:8000/posts?author=rodrigo\n```\n\nPodemos ordenar o resultado por um campo passado por _query param_ os parâmetros de *_sort* para o nome do campo e *_order* para o sentido (asc, desc);\n\n```\nlocalhost:8000/posts?_sort=author\u0026_order=desc\n```\n## CLI\n\n### Iniciando o servidor\n\nTambém é possível iniciar um servidor de forma mais simples através de comando CLI, para isso basta ter os arquivos JSON na pasta e rodar\n\n```shell\nvendor/bin/json-server start\n```\n\nPodemos passar os seguintes parâmetros:\n\nParâmetros         | Descrição\n-------------------|------------\ndata-dir=PATH      | especifica o diretório contento os arquivos json como `database.json` \nport=PORT          | especifica a porta que o servidor irá rodar\n--use-static-route | habilita o middelware de rotas estáticas, as rotas devem ser especificadas no arquivos `static.json`\n\n### Gerando o database.json\n\nPodemos gerar o arquivo de dados utilizando o seguinte comando\n\n```shell\nvendor/bin/json-server generate database resource1 resource2 ... \n```\n\nPodemos passar os seguinte parâmentros\n\nParâmetros        | Descrição\n------------------| --------------------\nfilename=FILENAME | especifica o nome do arquivo que será gravado os dados\nembed=RELATIONS   | especifica as relações dos _resources_. Deve ser passado no formato: 'resourcePai[resourceFilho1,resourceFilho2]; ... '\n\n### Gerando dados dos _Resources_\n\nPodemos gerar os dados de um _resource_ utilizando o seguinte comando:\n\n```shell\nvendor/bin/json-server generate resources resource_name [filename=FILENAME] [fields=FIELDS_LIST]\n```\n\nPodemos passar os seguinte parâmentros\n\nParâmetros           | Descrição\n---------------------| --------------------\nfilename=FILENAME    | especifica o nome do arquivo que será gravado os dados\nnum=NUM_OF_RESOURCES | especifica o número de _resources_ a serem criados             \nfields=FIELDS_LIST   | lista de campos a serem criados no _resource_. Deve ser informado no formato. _'field.type;field.type; ...'_. O _type_ deve ser um método do lib [Faker](https://fakerphp.github.io/), com seus parâmetros(se houver) passados separados por ponto após o nome do método. Ex.: `idade.numberBetween.20.70`\n\n### Gerando rotas estáticas\n\nPodemos gerar o arquivo de rotas estaticas para o middleware `StaticMiddleware` com o seguinte comando:\n\n```shell\nvendor/bin/json-server generate database static [filename=FILENAME] [path=PATH] [method=METHOD] [body=BODY] [statusCode=STATUS_CODE] [headers=HEADER-LIST]\n```\n\nParâmetros             | Descrição\n-----------------------| --------------------\nfilename=FILENAME      | especifica o nome do arquivo que será gravado os dados\npath=PATH              | path da rota\nmethod=METHOD          | método da rota\nbody=BODY              | body da resposta\nstatusCode=STATUS_CODE | código de esta http da resposta\nheaders=HEADER-LIST    | lista de header da resposta. Informadado no formato headers=\"header1|valor-header1|header2|valor-header2\"","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodrigoaramburu%2Fphp-json-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodrigoaramburu%2Fphp-json-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodrigoaramburu%2Fphp-json-server/lists"}