Laravel 5(2015 年釋出)帶來了框架級的架構重構,確立了現代 Laravel 的核心骨架。本文深度剖析目錄結構變化、PSR-4 命名空間、HTTP 分層、Middleware 機制、路由快取、Service 層設計哲學與 Model 組織方式,幫助開發者理解設計意圖並遷移既有專案。
| Laravel 4.2 | Laravel 5.0 | 變化說明 |
|---|---|---|
| app/commands | app/Console/Commands | Artisan 指令統一歸口 |
| app/controllers | app/Http/Controllers | 控制器歸屬 HTTP 層 |
| app/models | (移除,自行建立) | 不再預設 Models 目錄,鼓勵領域驅動組織 |
| app/config | config/ | 設定檔提升至專案根目錄 |
| app/database | database/ | 遷移、種子獨立目錄 |
| app/lang | resources/lang | 語系檔歸屬資源層 |
| app/views | resources/views | 視圖檔歸屬資源層 |
| app/start | bootstrap/ | 啟動引導程序 |
| — | app/Http/Middleware | 全新:中介層取代 Filter |
| — | app/Http/Requests | 全新:表單請求驗證物件 |
| — | app/Providers | 服務提供者統一管理 |
| — | app/Services | 建議:業務邏輯服務層 |
| — | app/Events, app/Listeners | 事件系統 |
Laravel 5 預設註冊 App\\ 根命名空間對應 app/ 目錄,完全遵循 PSR-4 自動載入:
// composer.json 自動載入配置
"autoload": {
"classmap": ["database"],
"psr-4": {
"App\\": "app/"
}
}
影響:所有 app/ 下類別必須宣告命名空間,如 namespace App\Http\Controllers;。使用時需 use App\Models\User;,雖稍顯繁瑣,但帶來清晰的模組邊界與 IDE 完整支援。
app/Http/
├── Controllers/ # 控制器:接收請求、回應
├── Middleware/ # 中介層:請求過濾、認證、日誌、CORS
├── Requests/ # 表單請求:驗證邏輯封裝、授權檢查
├── Kernel.php # HTTP 核心:全域/路由中介層註冊
└── routes.php # 路由定義(5.3+ 移至 routes/web.php)
Laravel 4 的 filters.php 升級為類別化 Middleware:
// app/Http/Middleware/Authenticate.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Authenticate {
public function handle($request, Closure $next) {
if (!Auth::check()) {
return redirect('login');
}
return $next($request);
}
}
// Kernel.php 註冊
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'admin' => \App\Http\Middleware\AdminOnly::class,
];
// 路由使用
Route::get('dashboard', 'DashboardController@index')->middleware('auth');
Route::group(['middleware' => 'admin'], function () { ... });
優勢:依賴注入支援、可測試、可複用、支援前置/後置處理(terminable)。
// app/Http/Requests/StoreUserRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest {
public function authorize() { return true; } // 或檢查權限
public function rules() {
return [
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
}
// 控制器自動注入並驗證
public function store(StoreUserRequest $request) {
// 驗證失敗自動回傳 422 + 錯誤訊息
$user = User::create($request->validated());
return response()->json($user, 201);
}
# 建立路由快取(極大提升路由解析速度)
php artisan route:cache
# 清除快取
php artisan route:clear
# 注意:快取後路由檔案異動不生效,部署流程需包含 route:cache
Laravel 5 內建 app/Services/ 目錄(需自行建立),倡導「控制器瘦身、服務豐満」:
// app/Services/Registrar.php
namespace App\Services;
use App\Models\User;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
use Illuminate\Support\Facades\Validator;
class Registrar implements RegistrarContract {
public function validator(array $data) {
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:8',
]);
}
public function create(array $data) {
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
// 控制器構造函數自動注入
// app/Http/Controllers/Auth/AuthController.php
public function __construct(
\Illuminate\Contracts\Auth\Guard $auth,
Registrar $registrar
) {
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
public function postRegister(\Illuminate\Http\Request $request) {
$validator = $this->registrar->validator($request->all());
if ($validator->fails()) {
$this->throwValidationException($request, $validator);
}
$this->auth->login($this->registrar->create($request->all()));
return redirect($this->redirectPath());
}
核心優勢:
// 建議結構
app/
├── Models/
│ ├── User.php
│ ├── Order.php
│ └── Traits/ # 模型共用 Trait
├── Services/
├── Repositories/ # 可選:資料存取層
└── ...
// Model 命名空間
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model { ... }
// 使用時
use App\Models\User;
User::find(1);
app/config/* → config/app/database/* → database/app/lang/* → resources/lang/app/views/* → resources/views/namespace App\Http\Controllers;,移至 app/Http/Controllers/app/Models/,加入 namespace App\Models;Kernel.phppsr-4 映射,執行 composer dump-autoloadRoute::controller 命名空間相對於 App\Http\Controllers)php artisan route:cache 驗證Laravel 5 的架構變革奠定了至今(Laravel 11)仍沿用的核心設計哲學:**關注點分離、依賴注入、介面導向、HTTP 層純淨化**。深入理解這些變化,能幫助你寫出更符合框架慣例、可維護性更高的應用程式。