Edited at

WindowsでDocker使ってLaravelでRestAPIを作ってみた(Laradock使用!)

More than 1 year has passed since last update.


概要

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

参考:Laravel使った開発にLaradockを使うというのはどうだろう


環境情報


  • 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で確認してみてください。

上記4つのコンテナのStateがUpであれば次の手順に進めます。


LaravelでRESTfulなAPIを開発してみる(投稿機能)

参考:LaravelでRest APIを開発する

続けて、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

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

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

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

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形式でデータが返ってきたら成功です。