この記事は、【メリット3つ】PHP完全ガイド|未経験から始める最短ルート の続編です。
PHPの基礎(変数、配列、関数、フォーム処理)を学んだ皆さん、おめでとうございます! $_POST でデータを受け取ったり、ファイルに情報を保存したりできるようになりましたね。
しかし、実際の開発現場では、セキュリティ、データベース管理、コードの整理(いわゆる「スパゲッティコード」の回避)など、考慮すべきことが山積みです。
そこで登場するのが、**PHPフレームワーク「Laravel」**です。
この記事では、PHPの基礎を終えたあなたが、最短ルートでモダンなWeb開発スキルを身につけるための「Laravel学習ガイド」をお届けします。
目次
-
- なぜPHPの次にLaravelなのか
-
- Laravelの3つの圧倒的メリット
- 2-1. 開発が「楽しく」なる(開発者体験)
- 2-2. 必要な機能が「全部入り」(フルスタック)
- 2-3. 学習リソースが「世界一」豊富
-
- 開発環境を整える(ComposerとSail)
- 3-1. Composerのインストール
- 3-2. Laravel Sail (セイル) で環境構築
-
- Laravelの基礎知識 (MVCモデル)
- 4-1. ルーティング (routes/web.php)
- 4-2. コントローラー (Controller)
- 4-3. ビュー (View) と Blade
- 4-4. モデル (Model) とマイグレーション
-
- 超実践!簡単なブログシステムを作る (CRUD完全版 手取り足取りガイド)
- ステップ1: Laravelプロジェクトを作成する
- ステップ2: 作成したフォルダに移動する
- ステップ3: 開発環境 (Laravel Sail) を準備する
- ステップ4: 開発環境を起動する
- ステップ5: データベースの設計図 (マイグレーション) を作る
- ステップ6: マイグレーションファイル(設計図)を編集する
- ステップ7: データベースにテーブルを作成する
- ステップ8: コントローラー(司令塔)を作成する
- ステップ9: ルーティング(URLの受付窓口)を設定する
- ステップ10: ビュー(HTML画面)を作成・編集する
- 10-1. 作成フォーム (create.blade.php) - 新規作成
- 10-2. 一覧表示 (index.blade.php) - 新規作成&編集・削除ボタン追加
- 10-3. 編集フォーム (edit.blade.php) - 新規作成
- ステップ11: コントローラー(司令塔)のロジックを記述する
- ステップ12: 動作確認
-
- 次のステップ
-
- まとめ
1. なぜPHPの次にLaravelなのか
「PHPを学んだけど、次は何をすれば?」
「WordPressのカスタマイズはできるけど、本格的なWebサービスを作りたい」
そう思ったなら、答えはLaravel一択です。
- PHPは「言語」(道具を作るための素材)
- Laravelは「フレームワーク」(高性能な工具箱・設計図)
process.php のようなファイルを作ってフォーム処理をしていたのが、Laravelを使うと、はるかに安全で、整理され、効率的に開発を進められます。
2. Laravelの3つの圧倒的メリット
2-1. 開発が「楽しく」なる(開発者体験)
Laravelは「開発者体験(DX)」を非常に重視しています。
-
Artisan (アルチザン) コマンド: ターミナルから
php artisan make:controllerのようにコマンドを打つだけで、必要なファイル(設計図)を自動生成してくれます。 - 美しいコード: 文法が直感的で、読みやすいコードを自然と書けるように設計されています。
2-2. 必要な機能が「全部入り」(フルスタック)
Webサービスに必要な機能の「面倒な部分」は、あらかじめLaravelが用意してくれています。
-
認証機能: ログイン、新規登録、パスワードリセット。
php artisan breeze:installと数コマンド打つだけで、高機能な会員システムが完成します。 - Eloquent (エロクエント) ORM: データベース(MySQLなど)を、PHPの「オブジェクト」として直感的に操作できます。SQLを直接書く必要がほとんどありません。
-
Blade (ブレード) テンプレート: HTMLとPHPをきれいに分離できます。もうHTMLタグの途中に
<?php echo ...; ?>と書く必要はありません。
2-3. 学習リソースが「世界一」豊富
Laravelは世界で最も人気のあるPHPフレームワークです。
- 公式ドキュメント(日本語): 非常に高品質で、翻訳も充実しています。
- Laracasts (ララキャスツ): 「LaravelのNetflix」と呼ばれる公式の動画学習サイト。質・量ともに圧倒的です。
- コミュニティ: 利用者が多いため、日本語の情報も豊富。エラーで困っても、検索すればすぐに解決策が見つかります。
3. 開発環境を整える(ComposerとSail)
PHP習得ガイドでは XAMPP / MAMP を使いましたが、Laravelではより現代的な方法を使います。
3-1. Composerのインストール
LaravelはComposer (コンポーザー) という「PHPのパッケージ管理ツール」を使ってインストールします。
composer は、Laravel本体や、その他必要なライブラリ(部品)を自動でダウンロードしてくれるツールです。まずはこれをインストールしましょう。
https://getcomposer.org/
3-2. Laravel Sail (セイル) で環境構築
XAMPPの代わりに、Laravel Sail を使いましょう。
Sailは、Dockerという技術を使い、あなたのPC(Windows, Mac, Linux)に影響を与えずに、Laravel開発用の完璧な環境(Webサーバー、PHP、データベース)を自動で構築してくれます。
-
プロジェクトの作成
ターミナル(コマンドプロンプト)で以下のコマンドを実行します。
(my-laravel-appの部分は好きな名前に変えてください)# (my-laravel-app というフォルダが作られます) composer create-project laravel/laravel my-laravel-app -
Sailのインストール
作成されたフォルダに移動し、Sailをインストールします。cd my-laravel-app php artisan sail:install(途中で
mysqlなどを選択する画面が出ます。[0]を選んでEnterでOKです) -
Sailの起動
./vendor/bin/sail up -d
たったこれだけです。 http://localhost にアクセスすると、Laravelの初期画面が表示されるはずです。
4. Laravelの基礎知識 (MVCモデル)
Laravelは MVC (Model - View - Controller) という設計思想に基づいています。
- Model (モデル): データベースとのやり取り担当。
- View (ビュー): ユーザーに見えるHTMLの部分。
- Controller (コントローラー): ユーザーからのリクエストを受け取り、ModelとViewを指揮する「司令塔」。
4-1. ルーティング (routes/web.php)
PHPの基礎では process.php のようにファイル名がURLになりましたが、Laravelは違います。
routes/web.php ファイルが、どのURLにアクセスが来たら、どのコントローラーの処理を呼ぶかを定義します。
例: routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
// URL「/posts」に来たリクエストを、PostControllerのindexメソッドに渡す
Route::get('/posts', [PostController::class, 'index']);
// URL「/posts/create」に来たリクエストを、PostControllerのcreateメソッドに渡す
Route::get('/posts/create', [PostController::class, 'create']);
// URL「/posts」(POST送信)に来たリクエストを、PostControllerのstoreメソッドに渡す
Route::post('/posts', [PostController::class, 'store']);
4-2. コントローラー (Controller)
「司令塔」です。artisan コマンドで作成します。
php artisan make:controller PostController
例: app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request; // フォーム情報を受け取るために必要
use App\Models\Post; // データベース操作のために必要
class PostController extends Controller
{
// 一覧表示 ( /posts )
public function index()
{
$posts = Post::all(); // データベースから全投稿を取得
return view('posts.index', ['posts' => $posts]); // 'posts.index'ビューにデータを渡す
}
// 登録フォーム表示 ( /posts/create )
public function create()
{
return view('posts.create');
}
// 登録処理 ( /posts へのPOST )
public function store(Request $request)
{
// (ここでバリデーション処理)
$post = new Post();
$post->title = $request->input('title'); // フォームの'title'を受け取る
$post->body = $request->input('body'); // フォームの'body'を受け取る
$post->save(); // データベースに保存
return redirect('/posts'); // 終わったら一覧ページに戻る
}
}
$_POST['title'] と書いていた部分が $request->input('title') になっていることに注目してください。
4-3. ビュー (View) と Blade
resources/views/ フォルダに置かれるHTMLファイルです。Laravelでは .blade.php という拡張子を使います。
例: resources/views/posts/create.blade.php (登録フォーム)
<!DOCTYPE html>
<html lang="ja">
<head>
<title>新規投稿</title>
</head>
<body>
<h1>新しい投稿を作成</h1>
<form action="/posts" method="POST">
@csrf
<div>
<label>タイトル:</label>
<input type="text" name="title">
</div>
<div>
<label>内容:</label>
<textarea name="body"></textarea>
</div>
<button type="submit">送信</button>
</form>
</body>
</html>
例: resources/views/posts/index.blade.php (一覧表示)
<!DOCTYPE html>
<html lang="ja">
<head>
<title>投稿一覧</title>
</head>
<body>
<h1>投稿一覧</h1>
@foreach ($posts as $post)
<div>
<h2>{{ $post->title }}</h2>
<p>{{ $post->body }}</p>
</div>
@endforeach
</body>
</html>
<?php foreach(...): ?> が @foreach に、 <?php echo htmlspecialchars(...) ?> が {{ ... }} に変わり、非常にスッキリしました。
4-4. モデル (Model) とマイグレーション
データベースとのやり取りを担当します。
1. マイグレーション(データベースの設計図)
artisan コマンドでModelと同時にマイグレーションファイルを作成します。
# Postモデルと、postsテーブル用のマイグレーションファイル(-m)を作成
php artisan make:model Post -m
database/migrations/xxxx_create_posts_table.php が作成されます。
// ...
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // 自動で増える番号 (主キー)
$table->string('title'); // タイトル (文字列)
$table->text('body'); // 内容 (長文テキスト)
$table->timestamps(); // created_at と updated_at (作成日時・更新日時)
});
}
// ...
2. データベースの実行
この設計図を元に、データベースにテーブルを作成します。
./vendor/bin/sail artisan migrate
これでMySQL内に posts テーブルが作成されます。
3. モデル (app/Models/Post.php)
このファイルが、posts テーブルとPHPのコードを繋ぐ役割をします。
(artisan が自動生成するので、基本的には中身は空のままでOKです)
5. 超実践!簡単なブログシステムを作る (CRUD完全版 手取り足取りガイド)
PHPの基礎を終えた方がLaravelを使い、Webサービスの基本機能であるCRUD(作成・一覧・更新・削除)をすべて備えたシンプルなブログシステムを作る手順を、全コマンドと全コード付きで具体的に解説します。
ステップ1: Laravelプロジェクトを作成する
ターミナル(コマンドプロンプトやPowerShellなど)を開き、作業したいフォルダで以下のコマンドを実行します。my-blog-app というプロジェクトが作成されます。
composer create-project laravel/laravel my-blog-app
ステップ2: 作成したフォルダに移動する
これ以降のコマンドは、すべてこのプロジェクトフォルダ内(my-blog-app)で実行します。
cd my-blog-app
ステップ3: 開発環境 (Laravel Sail) を準備する
Laravel Sail(開発環境)をインストールします。
php artisan sail:install
(途中で [0] mysql を選んでEnterを押します)
ステップ4: 開発環境を起動する
Sailを起動します。初回は環境構築のため5〜10分ほどかかります。
./vendor/bin/sail up -d
起動したら、ブラウザで http://localhost にアクセスし、Laravelの初期画面が表示されることを確認してください。
ステップ5: データベースの設計図 (マイグレーション) を作る
ブログの「投稿 (Post)」に必要なデータベース設計図(マイグレーション)と、それに対応する「モデル (Model)」を一度に作成します。
(これ以降、php artisan の代わりに ./vendor/bin/sail artisan を使います)
./vendor/bin/sail artisan make:model Post -m
ステップ6: マイグレーションファイル(設計図)を編集する
database/migrations/ フォルダ内に作られた ...create_posts_table.php ファイルを開き、up メソッドに「タイトル (title)」と「本文 (body)」のカラム定義を追加します。
ファイル: database/migrations/xxxx_..._create_posts_table.php
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
// ↓ この2行を追加 ↓
$table->string('title'); // タイトル
$table->text('body'); // 本文
// ↑ この2行を追加 ↑
$table->timestamps();
});
}
ステップ7: データベースにテーブルを作成する
編集した設計図を元に、データベースに posts テーブルを作成します。
./vendor/bin/sail artisan migrate
ステップ8: コントローラー(司令塔)を作成する
リクエストを処理する PostController を作成します。
./vendor/bin/sail artisan make:controller PostController
ステップ9: ルーティング(URLの受付窓口)を設定する
routes/web.php ファイルを開き、CRUD操作(一覧、作成フォーム、作成処理、編集フォーム、更新処理、削除処理)に対応するURLをすべて定義します。
ファイル: routes/web.php
<?php
use Illuminate\Support\Facades\Route;
// ↓ この行を追加 ↓
use App\Http\Controllers\PostController;
// 最初からあるウェルカムページ (そのまま)
Route::get('/', function () {
return view('welcome');
});
// ↓ 以下のCRUDルートをすべて追加 ↓
// 1. 一覧表示 (Read)
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
// 2. 作成フォーム表示 (Create)
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
// 3. 作成処理 (Create)
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
// 4. 編集フォーム表示 (Update)
// {post} の部分には投稿のIDが入る (例: /posts/1/edit)
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->name('posts.edit');
// 5. 更新処理 (Update)
Route::put('/posts/{post}', [PostController::class, 'update'])->name('posts.update');
// 6. 削除処理 (Delete)
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
ステップ10: ビュー(HTML画面)を作成・編集する
resources/views/ フォルダ内に、新しく posts フォルダを作成します。そこに以下のファイルを作成・配置します。
10-1. 作成フォーム (create.blade.php) - 新規作成
ファイル: resources/views/posts/create.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>新規投稿作成</title>
<style>
body { font-family: sans-serif; margin: 40px; background-color: #f9f9f9; }
.container { max-width: 600px; margin: 0 auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
h1 { margin-top: 0; }
div { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type="text"], textarea { width: 100%; padding: 8px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; }
button { background: #007bff; color: white; padding: 10px 15px; border: none; cursor: pointer; border-radius: 4px; }
button:hover { background: #0056b3; }
.back-link { margin-top: 20px; display: inline-block; }
</style>
</head>
<body>
<div class="container">
<h1>新規投稿作成</h1>
<form action="{{ route('posts.store') }}" method="POST">
@csrf <div>
<label for="title">タイトル:</label>
<input type="text" id="title" name="title" required>
</div>
<div>
<label for="body">本文:</label>
<textarea id="body" name="body" rows="5" required></textarea>
</div>
<button type="submit">投稿する</button>
</form>
<a href="{{ route('posts.index') }}" class="back-link">← 投稿一覧に戻る</a>
</div>
</body>
</html>
10-2. 一覧表示 (index.blade.php) - 新規作成&編集・削除ボタン追加
ファイル: resources/views/posts/index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>投稿一覧</title>
<style>
body { font-family: sans-serif; margin: 40px; background-color: #f9f9f9; }
.container { max-width: 700px; margin: 0 auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
h1 { margin-top: 0; }
.create-link a { background: #28a745; color: white; padding: 10px 15px; text-decoration: none; border-radius: 4px; display: inline-block; margin-bottom: 20px; }
.create-link a:hover { background: #218838; }
.post-item { border: 1px solid #eee; padding: 15px; margin-bottom: 15px; border-radius: 5px; }
.post-item h2 { margin: 0 0 10px 0; }
.post-item p { margin: 0 0 15px 0; color: #333; line-height: 1.6; }
.post-actions { display: flex; gap: 10px; }
.edit-btn { background: #ffc107; color: #333; padding: 5px 10px; text-decoration: none; border-radius: 4px; font-size: 14px; }
.delete-btn { background: #dc3545; color: white; padding: 5px 10px; border: none; cursor: pointer; border-radius: 4px; font-size: 14px; }
</style>
</head>
<body>
<div class="container">
<h1>投稿一覧</h1>
@if (session('success'))
<div style="color: green; margin-bottom: 15px;">
{{ session('success') }}
</div>
@endif
<div class="create-link">
<a href="{{ route('posts.create') }}">+ 新規投稿を作成する</a>
</div>
@if ($posts->isEmpty())
<p>まだ投稿がありません。</p>
@else
@foreach ($posts as $post)
<div class="post-item">
<h2>{{ $post->title }}</h2>
<p>{!! nl2br(e($post->body)) !!}</p>
<div class="post-actions">
<a href="{{ route('posts.edit', $post) }}" class="edit-btn">編集</a>
<form action="{{ route('posts.destroy', $post) }}" method="POST" onsubmit="return confirm('本当に削除しますか?');">
@csrf
@method('DELETE') <button type="submit" class="delete-btn">削除</button>
</form>
</div>
</div>
@endforeach
@endif
</div>
</body>
</html>
10-3. 編集フォーム (edit.blade.php) - 新規作成
ファイル: resources/views/posts/edit.blade.php
(create.blade.php をコピーして作ると早いです)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>投稿編集</title>
<style>
body { font-family: sans-serif; margin: 40px; background-color: #f9f9f9; }
.container { max-width: 600px; margin: 0 auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
h1 { margin-top: 0; }
div { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type="text"], textarea { width: 100%; padding: 8px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; }
button { background: #007bff; color: white; padding: 10px 15px; border: none; cursor: pointer; border-radius: 4px; }
button:hover { background: #0056b3; }
.back-link { margin-top: 20px; display: inline-block; }
</style>
</head>
<body>
<div class="container">
<h1>投稿編集</h1>
<form action="{{ route('posts.update', $post) }}" method="POST">
@csrf
@method('PUT') <div>
<label for="title">タイトル:</label>
<input type="text" id="title" name="title" value="{{ $post->title }}" required>
</div>
<div>
<label for="body">本文:</label>
<textarea id="body" name="body" rows="5" required>{{ $post->body }}</textarea>
</div>
<button type="submit">更新する</button>
</form>
<a href="{{ route('posts.index') }}" class="back-link">← 投稿一覧に戻る</a>
</div>
</body>
</html>
ステップ11: コントローラー(司令塔)のロジックを記述する
app/Http/Controllers/PostController.php を開き、ステップ9で定義したすべての処理(index, create, store, edit, update, destroy)の中身を記述します。
ファイル: app/Http/Controllers/PostController.php
<?php
namespace App\Http{namespace App\Http\Controllers;
use Illuminate\Http\Request;
// ↓ モデル(Post)を使うために追加 ↓
use App\Models\Post;
// ↓ バリデーションの例外を扱うために追加 (今回はstoreのみで使用) ↓
use Illuminate\Validation\ValidationException;
class PostController extends Controller
{
/**
* 1. 一覧表示 (Read)
*/
public function index()
{
// 投稿を新しい順にすべて取得
$posts = Post::orderBy('created_at', 'desc')->get();
// viewヘルパーで 'posts.index' ビューを返す
// compact('posts') は ['posts' => $posts] と同じ意味
return view('posts.index', compact('posts'));
}
/**
* 2. 作成フォーム表示 (Create)
*/
public function create()
{
return view('posts.create');
}
/**
* 3. 作成処理 (Create)
*/
public function store(Request $request)
{
// バリデーション
$request->validate([
'title' => 'required|max:255', // titleは必須、255文字以内
'body' => 'required', // bodyは必須
]);
// データベースに保存
$post = new Post();
$post->title = $request->input('title');
$post->body = $request->input('body');
$post->save();
// 一覧ページにリダイレクトし、成功メッセージをセッションに保存
return redirect()->route('posts.index')->with('success', '投稿が完了しました。');
}
/**
* 4. 編集フォーム表示 (Update)
*
* @param \App\Models\Post $post (ルートモデルバインディング)
*/
public function edit(Post $post)
{
// ルートモデルバインディングにより、URLのIDに対応するPostモデルが自動的に$postに渡される
return view('posts.edit', compact('post'));
}
/**
* 5. 更新処理 (Update)
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Post $post (ルートモデルバインディング)
*/
public function update(Request $request, Post $post)
{
// バリデーション
$request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
// データを更新
$post->title = $request->input('title');
$post->body = $request->input('body');
$post->save(); // データベースに保存(更新)
// 一覧ページにリダイレクト
return redirect()->route('posts.index')->with('success', '投稿を更新しました。');
}
/**
* 6. 削除処理 (Delete)
*
* @param \App\Models\Post $post (ルートモデルバインディング)
*/
public function destroy(Post $post)
{
$post->delete(); // データベースから削除
// 一覧ページにリダイレクト
return redirect()->route('posts.index')->with('success', '投稿を削除しました。');
}
}
ステップ12: 動作確認
お疲れ様でした! これでCRUD機能がすべて揃いました。
ブラウザで動作を確認しましょう。
-
一覧 ( http://localhost/posts )
「+ 新規投稿を作成する」をクリック。 -
作成 ( http://localhost/posts/create )
タイトルと本文を入力して「投稿する」。 -
一覧 ( http://localhost/posts )
投稿が追加され、「投稿が完了しました。」とメッセージが出ることを確認。 -
編集 (一覧ページ →「編集」ボタン)
投稿内容がフォームに入った状態で編集ページが開くことを確認。
内容を書き換えて「更新する」ボタンを押す。 -
一覧 ( http://localhost/posts )
内容が更新され、「投稿を更新しました。」とメッセージが出ることを確認。 -
削除 (一覧ページ →「削除」ボタン)
確認ダイアログ(「本当に削除しますか?」)が出ることを確認。
「OK」を押すと投稿が消え、「投稿を削除しました。」とメッセージが出ることを確認。
これで、Laravelによる基本的なWebアプリケーションの完成です!
6. 次のステップ
Laravelの世界は広大です。
-
認証機能:
sail artisan breeze:installを実行してみましょう。一瞬でログイン機能が完成し、驚くはずです。 -
Eloquent ORM:
Post::find(1)(ID=1の投稿取得),Post::where('title', '...')->get()(タイトルで検索) など、高度なデータベース操作を学びましょう。 - Laracasts: 最高の学習サイトです。基礎を終えたら、ぜひ覗いてみてください。
7. まとめ
PHPの基礎を終えた今、あなたは「Laravel」という強力なロケットを手に入れる準備ができました。
XAMPPで htdocs にファイルを作っていた時代は終わりです。
これからは artisan コマンドでコードを自動生成し、Sail でクリーンな環境を動かし、Eloquent でスマートにデータベースを操作し、Blade で美しいHTMLを出力しましょう。
ようこそ、モダンなPHP開発の世界へ!