【Laravel超入門】web.php と api.php の違いとは??
Laravel を使い始めると、最初に出てくる疑問のひとつがこれ。
Q1. そもそも web.php と api.php って何?
A:
Laravel では「ルーティング」という仕組みで、URLと処理(コントローラやビュー)を結びつけています。
routes/ フォルダの中には、代表的にこの2つのルートファイルがあります。
web.php → ブラウザで見る普通のWebページ用
api.php → JSONデータを返すAPI用
ざっくり言うと、
Q2. どっちに書いても動くけど、違いはあるの?
A:あります!
実はこの2つ、**裏で自動的に違うミドルウェア(設定のようなもの)**が適用されています。
ファイル 主な特徴 自動で適用されるミドルウェア
web.php セッション、CSRF保護あり。HTMLを返す。 web ミドルウェアグループ
api.php セッションなし。JSONを返す。 api ミドルウェアグループ
つまり、
- web.php:ログイン状態を覚えたり、フォーム送信を守ったりする仕組み付き
- api.php:セッションなしで、トークン認証などを想定したシンプル構成
Q3. それぞれどんなときに使うの?
A:用途が違います。
✅ web.php に書くルート
・普通のWebページ(例:/home や /contact)
・Bladeテンプレートを表示するページ
・フォーム送信(CSRF保護が必要な場合)
・リダイレクト処理など
✅ api.php に書くルート
・JSONデータを返すAPI
(例:/api/users や /api/posts)
・Vue.jsやReactなどのSPA(フロント)から呼び出されるデータ取得用
・外部サービスとの通信
・トークン認証で使うエンドポイント
Q4. 実際のコード例を見たい!
🧩 web.php の例
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome'); // Bladeテンプレートを返す
});
Route::post('/contact', [ContactController::class, 'submit']);
ブラウザからフォームを送ったり、画面を表示したりする処理はここ!
🧩 api.php の例
use Illuminate\Support\Facades\Route;
Route::get('/users', [UserController::class, 'index']); // JSONを返す
Route::post('/login', [AuthController::class, 'login']);
Vue.jsなどのフロントから axios.get('/api/users') のように呼び出す想定です。
Laravelが自動的に「/api」というプレフィックスを付けてくれます。
Q5. Vue.js + Laravel の構成だとどう使い分けるの?
A:こんな感じで分けるのが一般的です。
目的 | 書く場所 | 内容 |
---|---|---|
初期HTMLを返す(Vueアプリの土台) | web.php | return view('app') |
Vue側でデータを取得するAPI | api.php | JSONでデータ返す |
ログイン・ログアウト(セッション利用) | web.php | LaravelのAuth関連 |
フロントから呼び出すCRUD API | api.php | GET/POST/PUT/DELETE |
Q6. 間違えて逆に書いちゃったらどうなるの?
A:動くこともあるけど、トラブルのもとです。
例えば:
- APIを web.php に書くと → CSRFエラーになる場合がある
- フォーム送信を api.php に書くと → セッションが使えずログイン状態が維持できない
なので、「HTMLはweb.php、JSONはapi.php」と覚えるのが安全です。
まとめ
比較項目 | web.php | api.php |
---|---|---|
主な用途 | 通常のWebページ | JSONを返すAPI |
ミドルウェア | web | api |
CSRF保護 | あり | なし |
セッション | あり | なし(ステートレス) |
URLプレフィックス | なし | /api |
主な利用先 | ブラウザ | モバイルアプリ・SPA |
「API」と聞くと難しそうですが、要するに「データを返すだけのルート」のこと。
まずは web.php でWebページを作り、
後から api.php にデータ取得用のルートを増やしていくのがオススメです!
Discussion