{"id":19962645,"url":"https://github.com/sschonss/quest_journal","last_synced_at":"2026-05-09T05:03:08.978Z","repository":{"id":238946762,"uuid":"798013736","full_name":"sschonss/quest_journal","owner":"sschonss","description":"Laravel + GraphQL","archived":false,"fork":false,"pushed_at":"2024-05-09T20:36:03.000Z","size":100,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-01T16:48:09.865Z","etag":null,"topics":["graphql","laravel","php","sql"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sschonss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-08T23:24:39.000Z","updated_at":"2024-05-09T20:36:07.000Z","dependencies_parsed_at":"2024-05-09T03:42:28.710Z","dependency_job_id":"6539bbf5-fcfc-4ec4-b280-991042f36e46","html_url":"https://github.com/sschonss/quest_journal","commit_stats":null,"previous_names":["sschonss/quest_journal"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sschonss/quest_journal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sschonss%2Fquest_journal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sschonss%2Fquest_journal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sschonss%2Fquest_journal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sschonss%2Fquest_journal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sschonss","download_url":"https://codeload.github.com/sschonss/quest_journal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sschonss%2Fquest_journal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32807861,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["graphql","laravel","php","sql"],"created_at":"2024-11-13T02:12:23.551Z","updated_at":"2026-05-09T05:03:08.961Z","avatar_url":"https://github.com/sschonss.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Laravel + GraphQL\n\nExemplo muito simples e básico de como implementar GraphQL em um projeto Laravel.\n\n## Dependências\n\n`composer require rebing/graphql-laravel`\n\n## Publicando o arquivo de configuração\n\nDepois de instalar a dependência, você deve publicar o arquivo de configuração:\n\n`php artisan vendor:publish --provider=\"Rebing\\\\GraphQL\\\\GraphQLServiceProvider\"`\n\n## Criando as bases\n\nCrie migrations, models, factories e seeders normalmente.\n\n## Implementando o GraphQL\n\nAgora sim vamos implementar o GraphQL. \n\n### Estrutura de pastas\n\nCrie uma pasta chamada `GraphQL` dentro da pasta `app`.\n\nDentro da pasta `GraphQL`, crie uma pasta chamada `Types`, outra chamada `Queries` e outra chamada `Mutations`.\n\nVai ficar algo assim:\n\n![folder](./public/img/folder.png)\n\nExplicando:\n\n- `Types`: Aqui ficarão os tipos de dados que você quer retornar, pense algo como um modelo.\n- `Queries`: Aqui ficarão as buscas que você quer fazer, sejam elas simples ou complexas.\n- `Mutations`: Aqui ficarão as alterações que você quer fazer, como inserir, atualizar ou deletar.\n\nClaro que você pode criar mais pastas e organizar da forma que achar melhor.\nO importante é que o arquivo de configuração do GraphQL saiba onde encontrar esses arquivos.\n\n### Types\n\nDentro da pasta `Types`, crie um arquivo com o nome seguindo o padrão `NomeDaClasseType.php`.\n\nSegue um exemplo:\n\n```php\n\u003c?php\n\nnamespace App\\GraphQL\\Types;\n\nuse App\\Models\\Category;\nuse GraphQL\\Type\\Definition\\Type;\nuse Rebing\\GraphQL\\Support\\Type as GraphQLType;\nuse Rebing\\GraphQL\\Support\\Facades\\GraphQL;\n\nclass CategoryType extends GraphQLType\n{\n    protected $attributes = [\n        'name' =\u003e 'Category',\n        'description' =\u003e 'Collection of categories',\n        'model' =\u003e Category::class\n    ];\n\n    public function fields(): array\n    {\n        return [\n            'id' =\u003e [\n                'type' =\u003e Type::nonNull(Type::int()),\n                'description' =\u003e 'The id of the category'\n            ],\n            'title' =\u003e [\n                'type' =\u003e Type::nonNull(Type::string()),\n                'description' =\u003e 'The title of the category'\n            ],\n            'quests' =\u003e [\n                'type' =\u003e Type::listOf(GraphQL::type('Quest')),\n                'description' =\u003e 'The quests of the category'\n            ]\n        ];\n    }\n}\n```\nPerceba o uso do `Category::class` no atributo `model`. Isso é importante para que o GraphQL saiba de onde pegar os dados.\n\n#### Estrutura do arquivo Type\n\n- Extende a classe `GraphQLType` do pacote `rebing/graphql-laravel`.\n- Atributo `attributes`: Aqui você define o nome da classe, a descrição e a Model que será usada.\n- Método `fields`: Aqui você define os campos que serão retornados e o tipo de cada um.\n\n### Queries\n\nDentro da pasta `Queries`, crie uma pasta com o nome da entidade que você quer buscar.\n\nDentro dessa pasta, crie um arquivo com o nome singular da entidade seguido de `Query.php` (ex: `CategoryQuery.php`) e outro com o nome plural seguido de `Query.php` (ex: `CategoriesQuery.php`).\n\nAs pastas e arquivos ficarão assim:\n\n![Queries](./public/img/Queries.png)\n\nSegue um exemplo de `CategoryQuery.php`:\n\n```php\n\u003c?php\n\nnamespace App\\GraphQL\\Queries\\Category;\n\nuse App\\Models\\Category;\nuse GraphQL\\Type\\Definition\\Type;\nuse Rebing\\GraphQL\\Support\\Facades\\GraphQL;\nuse Rebing\\GraphQL\\Support\\Query;\n\nclass CategoryQuery extends Query\n{\n    protected $attributes = [\n        'name' =\u003e 'category',\n    ];\n\n    public function type(): Type\n    {\n        return GraphQL::type('Category');\n    }\n\n    public function args(): array\n    {\n        return [\n            'id' =\u003e [\n                'name' =\u003e 'id',\n                'type' =\u003e Type::int(),\n                'rules' =\u003e ['required']\n            ]\n        ];\n    }\n\n    public function resolve($root, $args): Category\n    {\n        return Category::findOrFail($args['id']);\n    }\n}\n```\n\nSegue um exemplo de `CategoriesQuery.php`:\n\n```php\n\u003c?php\n\nnamespace App\\GraphQL\\Queries\\Category;\n\nuse App\\Models\\Category;\nuse GraphQL\\Type\\Definition\\Type;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Rebing\\GraphQL\\Support\\Facades\\GraphQL;\nuse Rebing\\GraphQL\\Support\\Query;\n\nclass CategoriesQuery extends Query\n{\n    protected $attributes = [\n        'name' =\u003e 'categories',\n    ];\n\n    public function type(): Type\n    {\n        return Type::listOf(GraphQL::type('Category'));\n    }\n\n    public function resolve($root, $args): Collection\n    {\n        return Category::all();\n    }\n}\n```\n\n#### Estrutura do arquivo Query\n\n- `CategoryQuery.php`: Aqui você busca uma categoria específica, passando o `id` como argumento.\n- `CategoriesQuery.php`: Aqui você busca todas as categorias.\n- Atributo `attributes`: Aqui você define o nome da query.\n- Método `type`: Aqui você define o tipo de retorno. Lembre-se de usar o método `GraphQL::type('NomeDaClasse')`. Esse método pega o tipo que você definiu no arquivo `Type`.\n- Método `args`: Aqui você define os argumentos que a query vai receber. Só está sendo usado o `id` como exemplo e somente na `CategoryQuery`.\n- Método `resolve`: Aqui você define o que a query vai fazer. No caso, está retornando uma categoria específica ou todas as categorias.\n\nO método `resolve` é basicamente retornar os dados com Eloquent.\n\n### Mutations\n\nDentro da pasta `Mutations`, crie uma pasta com o nome da entidade que você quer alterar.\n\nDentro dessa pasta, crie os seguintes arquivos:\n\n- `CreateNomeDaClasseMutation.php`\n- `UpdateNomeDaClasseMutation.php`\n- `DeleteNomeDaClasseMutation.php`\n\nAs pastas e arquivos ficarão assim:\n\n![Mutations](./public/img/Mutations.png)\n\nSegue um exemplo de `CreateCategoryMutation.php`:\n\n```php\n\u003c?php\n\nnamespace App\\GraphQL\\Mutations\\Category;\n\nuse App\\Models\\Category;\nuse Rebing\\GraphQL\\Support\\Mutation;\nuse GraphQL\\Type\\Definition\\Type;\nuse Rebing\\GraphQL\\Support\\Facades\\GraphQL;\n\nclass CreateCategoryMutation extends Mutation\n{\n    protected $attributes = [\n        'name' =\u003e 'createCategory',\n        'description' =\u003e 'Creates a category'\n    ];\n\n    public function type(): Type\n    {\n        return GraphQL::type('Category');\n    }\n\n    public function args(): array\n    {\n        return [\n            'title' =\u003e [\n                'name' =\u003e 'title',\n                'type' =\u003e  Type::nonNull(Type::string()),\n            ],\n        ];\n    }\n\n    public function resolve($root, $args): Category\n    {\n        $category = new Category();\n        $category-\u003efill($args);\n        $category-\u003esave();\n\n        return $category;\n    }\n}\n```\n\nNos arquivos `UpdateNomeDaClasseMutation.php` e `DeleteNomeDaClasseMutation.php`, o processo é o mesmo, mudando apenas o nome da classe e o método `resolve`.\n\nDentro do método `resolve`, você faz a alteração ou exclusão dos dados.\n\nPode ser que você queira fazer validações antes de salvar, então você pode usar o método `rules` no método `args`.\n\n### Configurando o GraphQL\n\nDentro do arquivo `config/graphql.php`, você deve adicionar os arquivos que você criou como `schemas`.\n\n```php\n'schemas' =\u003e [\n        'default' =\u003e [\n            'query' =\u003e [\n                'quest' =\u003e App\\GraphQL\\Queries\\Quest\\QuestQuery::class,\n                'quests' =\u003e App\\GraphQL\\Queries\\Quest\\QuestsQuery::class,\n                'category' =\u003e App\\GraphQL\\Queries\\Category\\CategoryQuery::class,\n                'categories' =\u003e App\\GraphQL\\Queries\\Category\\CategoriesQuery::class,\n            ],\n            'mutation' =\u003e [\n                 'createQuest' =\u003e App\\GraphQL\\Mutations\\Quest\\CreateQuestMutation::class,\n                'updateQuest' =\u003e App\\GraphQL\\Mutations\\Quest\\UpdateQuestMutation::class,\n                'deleteQuest' =\u003e App\\GraphQL\\Mutations\\Quest\\DeleteQuestMutation::class,\n                'createCategory' =\u003e App\\GraphQL\\Mutations\\Category\\CreateCategoryMutation::class,\n                'updateCategory' =\u003e App\\GraphQL\\Mutations\\Category\\UpdateCategoryMutation::class,\n                'deleteCategory' =\u003e App\\GraphQL\\Mutations\\Category\\DeleteCategoryMutation::class,\n            ],\n            'middleware' =\u003e [],\n            'method' =\u003e ['get', 'post'],\n        ],\n    ],\n\n 'types' =\u003e [\n        // ExampleType::class,\n        // ExampleRelationType::class,\n        // \\Rebing\\GraphQL\\Support\\UploadType::class,\n        'Category' =\u003e App\\GraphQL\\Types\\CategoryType::class,\n        'Quest' =\u003e App\\GraphQL\\Types\\QuestType::class,\n    ],\n```\n\nNesse momento, você deve colocar os arquivos que você criou no lugar dos exemplos que estão no arquivo.\n\n### Rotas\n\nDentro do arquivo de configuração do GraphQL, você pode definir o prefixo das rotas.\n\n### Testando\n\nDentro do Postman, você pode fazer as requisições para testar.\n\n#### Query\n\n#### Exemplo Busca com ID específico\n\n```\n{\n    category(id: 1) {\n        id\n        title\n    }\n}\n```\n\n#### Exemplo Busca de todos\n\n```\n{\n    categories {\n        id\n        title\n    }\n}\n```\n\n#### Mutation\n\n#### Exemplo de criação\n\n```\nmutation {\n    createCategory(\n        title: \"Nova Categoria\"\n    ) {\n        id\n        title\n    }\n}\n```\n\n#### Exemplo de atualização\n\n```\nmutation {\n    updateCategory(\n        id: 1,\n        title: \"Categoria Atualizada\"\n    ) {\n        id\n        title\n    }\n}\n```\n\n#### Exemplo de exclusão\n\n```\nmutation {\n    deleteCategory(id: 12)\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsschonss%2Fquest_journal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsschonss%2Fquest_journal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsschonss%2Fquest_journal/lists"}