SlimでJSONを返すところまでメモ

# 概要
PHPの軽量フレームワークであるSlimを触ってみたのでメモ。
WebAPIを実装してレスポンスとしてJSONを返すところまで。

## 環境
macOS 10.13.6
PHP 7.1.23
composer 1.8.0
Slim 4.0.0

# インストール
[公式サイト](http://www.slimframework.com/docs/v4/start/installation.html)に載っている手順に従ってインストールを行なっていきます。

```bash
$ mkdir slim-test
$ cd slim-test
$ composer require slim/slim:4.0.0
$ composer require slim/psr7
```
これで最低限のインストールは完了です。

# 動作確認
## Hello worldを表示する
現状のディレクトリ構成は下記のようになっているはずですので、slim-test以下にpublicディレクトリを作成し、index.phpを記述していきます。

```bash
.
├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
・・・省略・・・
```

```
$ mkdir public
$ vi public/index.php
```

```php:index.php
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function (Request $request, Response $response, $args) {
    $response->getBody()->write("Hello world!");
    return $response;
});

$app->run();
```

記述したら下記コマンドを実行してブラウザで「localhost:8080」にアクセスするとHello world!とだけ記載されたページが確認できます。

```bash
$ php -S localhost:8080 -t public
PHP 7.1.23 Development Server started at Sun Aug 25 15:27:28 2019
Listening on http://localhost:8080
Document root is /path/to/slim-test/public
Press Ctrl-C to quit.
```

<img width="983" alt="スクリーンショット 2019-08-25 15.41.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183878/5de9e0e5-6cd7-9245-09ee-f9ed97d336c6.png">

## JSONを返す
現状だと「Hello world!」という文字列を返しているだけですので、JSONを返すように修正します。
※Slimのv3とv4で書き方が異なるので注意してください。

```php:index.php
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function (Request $request, Response $response, $args) {
    $data = array('response' => 'Hello world!');
    $payload = json_encode($data);
    $response->getBody()->write($payload);
    return $response->withHeader('Content-Type', 'application/json');
});

$app->run();
```

先程と同様にブラウザでアクセスするかcurlコマンドを実行してレスポンスを確認する。

<img width="1037" alt="スクリーンショット 2019-08-25 16.28.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183878/5bb3ff7a-4b52-bca5-b60b-d2395c531f6e.png">

```bash
$ curl localhost:8080
{"response":"Hello world!"}
```

これで、リクエストに対してJSONを返すことができました。

## パラメータを受け取る
レスポンスを固定で返しているので、受け取ったパラメータを反映させてみます。

```php:index.php
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function (Request $request, Response $response, $args) {
    $params = $request->getQueryParams();
    $data = array('response' => 'Hello '.$params['name']);
    $payload = json_encode($data);
    $response->getBody()->write($payload);
    return $response->withHeader('Content-Type', 'application/json');
});

$app->run();
```

```bash
$ curl localhost:8080?name=hogehoge
{"response":"Hello hogehoge"}
```

## 最終的なディレクトリ構成
```bash
.
├── README.md
├── composer.json
├── composer.lock
├── public
│   └── index.php
└── vendor
    ├── autoload.php
    ├── composer
・・・省略・・・
```

# 感想
お手軽にWebAPIを実装できる点は素晴らしかったです。JSONを返す書き方がv3とv4で違った点でちょっと躓いたので、バージョンの差異には注意しないといけませんでした。
備忘録的に書いていますので、もっとこうした方が良いとか内容間違っているとかありましたらご指摘下さい。

# 参考サイト
- [Response - Slim Framework](slimframework.com/docs/v4/objects/response.html)
- [Request - Slim Framework](http://www.slimframework.com/docs/v4/objects/request.html)