概要
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を開発してみる(投稿機能)
続けて、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形式でデータが返ってきたら成功です。