WindowsでDocker使ってLaravelでRestAPIを作ってみた（Laradock使用！）

# 概要
Webアプリ開発の研修でRestAPIを作ることになったので、Docker＋LaradockでLaravel使ったRestAPI開発をしてみました。

**参考：[Laravel使った開発にLaradockを使うというのはどうだろう](http://qiita.com/niisan-tokyo/items/d4485b8bb4fbfcfcc6be)**

## 環境情報

- Windows7
- Docker Toolbox
  - Docker（バージョン：1.12.0)
  - VirtualBox（バージョン：5.0.30）
- git version 2.9.0.windows.1

# Laradockで開発環境を整える

## Laradockの導入

Dockerを起動して、任意のディレクトリへcdで移動。
容量に余裕のある`(E:)`で作業しようとしたらうまくいかなかったため、私は`C:\Users\{ユーザー名}\docker`ディレクトリを作成し、そこで作業を進めました。

```
$ mkdir laraveltest
```

「laraveltest」部分は任意の名前にしてください。

```
$ cd laraveltest
$ git clone https://github.com/LaraDock/laradock.git
```

ここまででLaradockの導入はOKです。

## Laravelでcreate-projectする

```
$ cd laradock
$ docker-compose up -d workspace
$ docker-compose ps
```

`docker-compose ps`で現在立ち上がっているコンテナを確認します。

```
         Name               Command      State    Ports
-------------------------------------------------------
laradock_application_1   true            Exit 0
laradock_workspace_1     /sbin/my_init   Up
```

現在立ち上がっているコンテナは`laradock_workspace_1`です。
このworkspaceに入っていきます。

```
$ docker exec -it laradock_workspace_1 /bin/bash
```

続いて、プロジェクトを作っていきます。ここで「testapp」としているところはプロジェクト名をつけてください。

```
composer create-project laravel/laravel testapp
```

`Do not run Composer as root/super user! See https://getcomposer.org/root for details`と出てきますが、気にしない（気にした方がいいのかな？）。
時間がかかるので、Laravelのプロジェクトを作成し終わるまでは何か他の作業や勉強をしておくといいかもしれません。

`set successfully.`が出たらcreate-project成功です。

## ブラウザで表示できるように環境を確認する

```
 ls
laradock  testapp
 exit # workspaceから出る
$ docker-compose stop # 今動いているworkspaceを止める
$ ls ../
laradock/  testapp/
```

`ls ../`でホストPCにもtestappができている、ということが確認できました。

それでは、laradockディレクトリに作られている`docker-compose.yml`を開きます。

```
### Applications Code Container #############################

    applications:
        image: tianon/true
        volumes:
            - ../:/var/www
```

のところを

```
        volumes:
            - ../testapp:/var/www
```

に編集して保存します。
続いて、testapp/.envファイルを開いてDB_HOSTの値を下記のように変更して保存します。
※文字コードはUTF-8です。

```
DB_HOST=mysql
```

これで環境設定はOKです。下記で起動します。

```
$ docker-compose up -d php-fpm nginx mysql
```

起動が完了したら、ブラウザで192.168.99.100にアクセスして「Laravel」と表示されたらOKです。

ここで念のため、下記で全てのStateがUpになっているか確認しておきます（なぜかMySQLだけ立ち上がっていなくてのちのちSQLエラーが出ることがあるため）。

```
$ docker-compose ps
```

- laradock_workspace_1
- laradock_php-fpm_1
- laradock_nginx_1
- laradock_mysql_1

これから全てのStateがUpになっていればOKです。
Upになっていないコンテナがある場合は、一度docker-composeを止めて再起動したあと、もう一度`docker-compose ps`で確認してみてください。
上記４つのコンテナのStateがUpであれば次の手順に進めます。


# LaravelでRESTfulなAPIを開発してみる（投稿機能）

**参考：[LaravelでRest APIを開発する](http://dim5.net/laravel/developing-rest-api.html)**

続けて、Dockerでworkspaceに入って作業していきます。

```
$ docker exec -it laradock_workspace_1 /bin/bash
php artisan make:model Post
```

artisanコマンドでMVCモデルのModelとしてPost.phpを作成しました。

**testapp/app/Post.php**を開いて`protected~`を下記の通り追記します。

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
	protected $table = 'posts';
}
```

次に、testapp/app/Http/Controllers/Controller.phpを複製して下記を作成します。
**testapp/app/Http/Controllers/PostController.php**

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

use App\Http\Controllers\PostController;
use App\Post;

class PostController extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function getIndex() {
        $posts = Post::all();
        return response()->json(json_encode($posts));
    }
}
```

最後に、**testapp/routes/web.php**を編集します。

```php
<?php

Route::get('/', 'PostController@getIndex');
```


残りはDockerの方でmigrationファイルを作成していきます。

```
php artisan make:migration create_posts_table --create=posts
```

すると、**testapp/database/migrations/2016_12_21_025507_create_posts_table.php**ができています。
ファイル名冒頭の数字は作成日時です。
`testapp/config/app.php`の`'timezone' `を`'Asia/Tokyo'`に、`'locale'`を`'ja'`にするといいですが、
特に気にならない人はデフォルトのままでもいいと思います。
upメソッドにはデフォルトでidとtimestampsが作られているので、用途に合わせてカラムを追加します。
今回はPostなのでtitleとcontentを追加しました。

```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->string('title');
            $table->string('content');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
```

Dockerでmigrateします。

```
php artisan migrate
```

ここからはデータの挿入です。

```
php artisan tinker
>>> $posts = new App\Post();
>>> $posts->title = 'title 1';
>>> $posts->content = 'content1';
>>> $posts->save();
>>> exit
```

ブラウザを更新して、json形式でデータが返ってきたら成功です。