Laravel 5.7 + GraphQL（Install編）

# :x:追記: ご注意:x:

[folkloreinc/laravel-graphql](https://github.com/folkloreinc/laravel-graphql) こちらの記事で採用しているライブラリが 2019/2/10 にアーカイブされてしまいました😢😢😢
今後ライブラリ導入を検討される方は [nuwave/lighthouse](https://github.com/nuwave/lighthouse) を推奨します。

=========================================================

今回はLaravel5.7にGraphQLをインストールします。

## シリーズ記事

- [LaravelとGraphQLでAPI開発](https://qiita.com/ucan-lab/items/b1796b083ac5c0bcb019)
- Laravel 5.7 + GraphQL（Install編）
- [Laravel 5.7 + GraphQL（ScalarType編）](https://qiita.com/ucan-lab/items/32ee8dd18974d6146456)
- [Laravel 5.7 + GraphQL（Relation編）](https://qiita.com/ucan-lab/items/4eae9e538be9a7a7c5e9)
- [Laravel 5.7 + GraphQL（Dump Server編）](https://qiita.com/ucan-lab/items/ce9abab3fddec0d2d0eb)
- [Laravel 5.7 + GraphQL（Pagination編）](https://qiita.com/ucan-lab/items/c037d4bd07840af32b94)
- [Laravel 5.7 + GraphQL（ErrorHandling編）](https://qiita.com/ucan-lab/items/fa3bf9b1e7fca1b19d0d)
- [Laravel 5.7 + GraphQL（Test編）](https://qiita.com/ucan-lab/items/1815071cd1cf32d53008)

## Laravel5.7インストール

Laravelインストーラを用いてLaravelをインストールしました。
※インストーラ版はバージョン指定はできませんが最新版がインストールできます。

```shell-session
$ laravel new practice-laravel-graphql
$ cd practice-laravel-graphql
$ php artisan --version
Laravel Framework 5.7.9
```

執筆時の最新の5.7.9を使用しています。
`.env` に用意したデータベースの情報を適宜設定します。

### git commit

```shell-session
$ git init
$ git add .
$ git commit -m "laravel install"
```

## GraphQLのインストール

https://github.com/ucan-lab/practice-laravel-graphql/commit/9cf44f673a0330414b33d76f163b883d1a93b4d0

```shell-session
$ composer require folklore/graphql:dev-develop
```

https://github.com/Folkloreatelier/laravel-graphql/issues/376

2018/10/22時点では、Laravel5.7未対応ですがdevelopブランチの方で修正コミットされてます。
masterにマージされるまではdevelopブランチを使用したいと思います。

```shell-session
$ php artisan vendor:publish --provider="Folklore\GraphQL\ServiceProvider"
Copied File [/vendor/folklore/graphql/src/config/config.php] To [/config/graphql.php]
Copied Directory [/vendor/folklore/graphql/src/resources/views] To [/resources/views/vendor/graphql]
Publishing complete.
```

- `/config/graphql.php`
- `/resources/views/vendor/graphql/graphiql.php`

上記の2つのファイルが配置される。

### 追加されるGraphQLコマンド

```shell-session
$ php artisan list | grep graphql
  make:graphql:enum       Create a new GraphQL enum class
  make:graphql:field      Create a new GraphQL field class
  make:graphql:interface  Create a new GraphQL interface class
  make:graphql:mutation   Create a new GraphQL mutation class
  make:graphql:query      Create a new GraphQL query class
  make:graphql:scalar     Create a new GraphQL scalar class
  make:graphql:type       Create a new GraphQL type class
```

ひな型ファイルを作ってくれるコマンドが7種用意されてます。

### 追加されるGraphQLルーティング

```shell-session
$ php artisan route:list
+--------+----------+----------------------------+--------------------+---------------------------------------------+--------------+
| Domain | Method   | URI                        | Name               | Action                                      | Middleware   |
+--------+----------+----------------------------+--------------------+---------------------------------------------+--------------+
|        | GET|HEAD | /                          |                    | Closure                                     | web          |
|        | GET|HEAD | api/user                   |                    | Closure                                     | api,auth:api |
|        | GET|HEAD | graphiql/{graphql_schema?} | graphql.graphiql   | Folklore\GraphQL\GraphQLController@graphiql |              |
|        | GET|HEAD | graphql/{graphql_schema?}  | graphql.query      | Folklore\GraphQL\GraphQLController@query    |              |
|        | POST     | graphql/{graphql_schema?}  | graphql.query.post | Folklore\GraphQL\GraphQLController@query    |              |
+--------+----------+----------------------------+--------------------+---------------------------------------------+--------------+
```

GraphQLのルーティングが3つ追加されています。
`graphiql` のルートはGraphQLをブラウザで実行できます。

## graphiql

```shell-session
$ php artisan serve
```

http://127.0.0.1:8000/graphiql

<img width="1433" alt="スクリーンショット 2018-10-13 18.32.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/52879/0727f2a7-b9d0-64a1-f432-7ce27dbf5655.png">

### クエリ実行

<img width="637" alt="スクリーンショット 2018-10-13 22.46.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/52879/83fc849c-c833-2d5f-f9c9-f05ef202cb57.png">

こんな感じでクエリの実行とjsonデータの取得が行えます。