はじめに
Docker上でLaravel環境を構築し、メッセージ投稿フォームの作成を通じて基本的なMVC(Model-View-Controller)構成の流れを理解する学習を行いました。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
書こうと思ったきっかけ
個人的にPHPのキャッチアップをしたくて、Laravelを使った実践を通じて、フォーム入力 → バリデーション → データベース保存という一連の流れを学びたかったためです。完全に初学者としての備忘録となります。
内容
環境
- Laravel を Docker コンテナ上に構築
-
php-app
,mysql
,phpmyadmin
の3つのサービスで構成
コントローラーの作成
docker compose exec php-app php artisan make:controller MessageController
コントローラーの中身(重複定義の修正も含む)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Message;
class MessageController extends Controller
{
public function create()
{
return view('message.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:255',
'message' => 'required',
]);
Message::create($validated);
return redirect('/message')->with('success', '保存しました!');
}
}
モデルの作成と設定
docker compose exec php-app php artisan make:model Message -m
Messageモデルでは、$fillable
に name, message を指定:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
// 保存を許可するカラムを指定
protected $fillable = ['name', 'message'];
}
マイグレーションとDB作成
docker compose exec php-app php artisan migrate
ビューの作成
resources/views/message/create.blade.php
に以下を作成:
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>メッセージ投稿</title>
</head>
<body>
<h1>メッセージ投稿フォーム</h1>
@if(session('success'))
<p style="color:green">{{ session('success') }}</p>
@endif
<form action="/message" method="POST">
@csrf
<label>名前: <input type="text" name="name" required></label><br><br>
<label>メッセージ:<br><textarea name="message" rows="5" cols="40" required></textarea></label><br><br>
<button type="submit">送信</button>
</form>
</body>
</html>
ルーティング
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HelloController;
use App\Http\Controllers\MessageController;
Route::get('/', function () {
return view('welcome');
});
// Hello関連
Route::get('/hello', [HelloController::class, 'index']);
Route::post('/hello', [HelloController::class, 'post']);
// Message関連
Route::get('/message', [MessageController::class, 'create']);
Route::post('/message', [MessageController::class, 'store']);
まとめ
Laravelでの基本的なフォーム処理とDB保存までの流れを、一通り経験できました。
MessageControllerの重複定義エラーや BindingResolutionException
によるつまづきもありましたが、クラス定義の整理と composer dump-autoload
によるオートロードの修正で解決できました。
Docker環境との連携も含めて、今後のLaravel開発に向けての土台が少し見えてきました...!