はじめに
DockerとLaravel10を使ってMySQLのCRUD処理を行うAPIを作成してみました。
API作成
1.使っている環境にあったDockerDesktop、Ubuntu、Postman、をインストールしておいてください。
2.ターミナルを「Ubuntu(wsl)」で、以下のコマンドを実行するとLaravelのアプリケーションが作成されます。
curl -s https://laravel.build/ ここにアプリケーション名を入れます。 | bash
3.sailコマンドを簡単に実行できるように以下を設定します。
.bashrcファイルの最終行に以下を追加します。
( vi ~/.bashrc ESC モード切替 o 改行 :w セーブ :q 抜ける)
alias sail='[-f sail] && bash sail || bash vendor/bin/sail'
その後、以下を実行します。
source ~/.bashrc
4.開始
sail up -d
-dをつけるとバックグラウンドで実行します。
sailがエラー時、再起動および、実行しているディレクトリの場所を確認してみてください。
開始してからブラウザで
http://localhost
にアクセスするとLaravelの初期画面が表示されます。
5.停止
sail stop
6.phpMyAdminを追加する方法
docker-compose.ymlファイルのMysql:の各種命令文の下に以下を追加します。
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- 8080:80
depends_on:
- mysql
environment:
PMA_HOST: mysql
PMA_USER: '${DB_USERNAME}'
PMA_PASSWORD: '${DB_PASSWORD}'
networks:
- sail
追加の際、タブの位置がずれていると、うまくいかない場合があります。
ブラウザからlocalhost:8080にアクセスするとphpMyAdminに接続することができます。
7.日本対応
configフォルダ内のapp.phpファイルのtimezoneとlocaleを以下に書き換える。
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
うまくいかない場合は
.envファイルのDB_DATABASE,DB_USERNAMEを書き換える
DB_DATABASE = データベース名
DB_USERNAME = ユーザー名(root等)
8.以下コマンドで、モデル、マイグレーション、コントローラーファイルをまとめて作成します。
sail artisan make:model ここにモデル名を入れる、頭文字は大文字で(例.Todo) -m -c
出来上がるファイル
モデルファイル(app→Models内)
Todo.php
マイグレーションファイル(database→migrations内)
日時_create_todos_table.php
コントローラーファイル(app→Http→Controllers内)
TodoController.php
各ファイル記入例
モデルファイル(例.Todo.php)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Todo extends Model
{
use HasFactory;
protected $fillable = [
'text',
];
}
マイグレーションファイル(例.日時_create_todos_table.php)
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('todos', function (Blueprint $table) {
$table->id();
$table->text('text');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('todos');
}
};
コントローラーファイル(例.TodoController.php)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Todo;
use App\Http\Controllers\Controller;
class TodoController extends Controller
{
/**
* ToDo作成.
*
* @param Request $request
* @return void
*/
public function create(Request $request) {
$todo = Todo::create($request->all());
return response()->json($todo);
}
/**
* ToDo取得.
*
* @param Request $request
* @return void
*/
public function fetch(Request $request) {
$todo = Todo::find($request->id);
return response()->json($todo);
}
/**
* ToDo更新.
*
* @param Request $request
* @return void
*/
public function update(Request $request) {
$todo = Todo::find($request->id);
$todo->update([
'id' => $request->id,
'text' => $request->text,
]);
return response()->json($todo);
}
/**
* ToDo削除.
*
* @param Request $request
* @return void
*/
public function delete(Request $request) {
$todo = Todo::find($request->id);
$todo->delete();
return response()->json();
}
}
ルーティング(routesフォルダ内)
今回APIとして使うため
api.phpファイルを以下に書き換える。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TodoController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/
// ToDoのCRUD
Route::post('todo', [TodoController::class, 'create']);
Route::get('todo', [TodoController::class, 'fetch']);
Route::put('todo', [TodoController::class, 'update']);
Route::delete('todo', [TodoController::class, 'delete']);
});
これでAPIは完成になります。
作成したAPIの動作確認
1.Postmanでの確認方法
私が使用しているPostmanのタイムゾーン変更方法が不明の為、phpMyAdminの画面と
Postmanに表示されている時間に差異があります。
調べたところ
Settings→GeneralにあるTimezone項目で使用するタイムゾーンに設定とありましたが
使用しているバージョン(10.13.5)のPostmanには
上記の場所にTimezone項目がありませんでした。
2.入力例
以上になります。
最後に
最後まで読んでいただきまして、ありがとうございました。