Laravel 以優雅語法實踐 MVC,核心三元素:路由(HTTP 入口)、控制器(業務邏輯)、視圖(呈現層)。本文以最小範例串起完整流程。
<?php
use Illuminate\Support\Facades\Route;
// 根路徑 GET 請求 → 閉包直接回傳
Route::get('/', function () {
return 'Hello World ' . url('index');
});
// POST 請求範例
Route::post('/post', function () {
return '測試 POST';
});
// 參數綁定:{id} 自動對應閉包參數 $id
Route::get('/user/{id}', function ($id) {
return '用戶 ' . $id;
});
// 指向控制器動作:命名空間\類別@方法
Route::get('/index', 'Index\IndexController@index');
// 路由群組套用中介層(web 群組含 Session、CSRF 等)
Route::group(['middleware' => ['web']], function () {
// 這裡的路由自動擁有 Session、CSRF 保護
});
關鍵點:
routes/web.php(Web 介面)與 routes/api.php(API)。$,直接寫在大括號 {id}。命名空間\類別@方法,命名空間相對 App\Http\Controllers。位置:app/Http/Controllers/Index/IndexController.php
<?php
namespace App\Http\Controllers\Index;
use App\Http\Controllers\Controller; // 繼承基底控制器
class IndexController extends Controller {
public function index() {
$data = ['title' => 'Index 控制器'];
// view(視圖路徑, 資料陣列) — 點號分隔目錄
return view('index.index', $data);
}
}
規範:
StudlyCase + Controller 後綴。camelCase。Controller 獲得 view()、redirect()、response() 等助手。<body>
<div class="container">
<div class="content">
<div class="title"><?php echo $title; ?></div>
</div>
</div>
</body>
Blade 模板引擎(推薦):副檔名 .blade.php,語法更優雅:
{{-- resources/views/index/index.blade.php --}}
<div class="title">{{ $title }}</div>
{{-- 自動 HTML 轉義,防 XSS --}}
GET /indexpublic/index.php 啟動框架Route::get('/index', 'Index\IndexController@index')IndexController、呼叫 index()view('index.index', $data)resources/views/index/index.blade.php → PHP 程式碼Route::get('/user/{id}', 'UserController@show')
->where('id', '[0-9]+'); // 僅匹配數字
Route::resource('posts', 'PostController');
// 自動對應:
// GET /posts → index
// GET /posts/create → create
// POST /posts → store
// GET /posts/{post} → show
// GET /posts/{post}/edit → edit
// PUT /posts/{post} → update
// DELETE /posts/{post} → destroy
Route::get('/profile', 'UserController@profile')->name('profile');
// 視圖/控制器中生成 URL:
route('profile'); // https://domain/profile
route('profile', ['id' => 1]); // 參數化
{{-- resources/views/layouts/app.blade.php --}}
<html>
<body>
@yield('content')
</body>
</html>
{{-- resources/views/index/index.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>{{ $title }}</h1>
@endsection
| 誤區 | 正確做法 |
|---|---|
| 路由檔寫邏輯判斷 | 路由只負責分派,邏輯移至控制器/服務類 |
| 控制器直接操作 DB | 使用 Eloquent 模型或 Repository 模式 |
| 視圖用 | 改用 Blade {{ }} 自動轉義 |
| 命名空間寫錯導致 Class not found | 類別實際路徑必須與 namespace 對應,執行 composer dump-autoload |
掌握「路由→控制器→視圖」鐵三角,即可建立清晰可維護的 Laravel 應用。後續可深入:表單驗證、Eloquent ORM、中介層、授權策略、API 資源、測試、佇列等進階主題。