首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Laravel 5 核心架構變革深度解析:目錄結構、命名空間、HTTP 層與 Service 層設計

     編輯:PHP 相關知識

Laravel 5(2015 年釋出)帶來了框架級的架構重構,確立了現代 Laravel 的核心骨架。本文深度剖析目錄結構變化、PSR-4 命名空間、HTTP 分層、Middleware 機制、路由快取、Service 層設計哲學與 Model 組織方式,幫助開發者理解設計意圖並遷移既有專案。

目錄結構對比:4.2 vs 5.0

Laravel 4.2Laravel 5.0變化說明
app/commandsapp/Console/CommandsArtisan 指令統一歸口
app/controllersapp/Http/Controllers控制器歸屬 HTTP 層
app/models(移除,自行建立)不再預設 Models 目錄,鼓勵領域驅動組織
app/configconfig/設定檔提升至專案根目錄
app/databasedatabase/遷移、種子獨立目錄
app/langresources/lang語系檔歸屬資源層
app/viewsresources/views視圖檔歸屬資源層
app/startbootstrap/啟動引導程序
—app/Http/Middleware全新:中介層取代 Filter
—app/Http/Requests全新:表單請求驗證物件
—app/Providers服務提供者統一管理
—app/Services建議:業務邏輯服務層
—app/Events, app/Listeners事件系統

App 命名空間與 PSR-4

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 完整支援。

HTTP 層架構:app/Http/

app/Http/
├── Controllers/     # 控制器:接收請求、回應
├── Middleware/      # 中介層:請求過濾、認證、日誌、CORS
├── Requests/        # 表單請求:驗證邏輯封裝、授權檢查
├── Kernel.php       # HTTP 核心:全域/路由中介層註冊
└── routes.php       # 路由定義(5.3+ 移至 routes/web.php)

Middleware 取代 Filter

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)。

Form Request:驗證邏輯物件化

// 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

Service 層:業務邏輯封裝最佳實踐

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());
}

核心優勢:

  • 控制器僅負責 HTTP 協議轉換(請求→服務→回應)
  • 業務邏輯可單元測試、跨控制器複用、支援多入口(API、CLI、Queue)
  • 依賴介面而非實作,易於替換/擴展

Model 組織:自建 Models 目錄

// 建議結構
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);

遷移檢查清單(4.2 → 5.0)

  1. 移動 app/config/* → config/
  2. 移動 app/database/* → database/
  3. 移動 app/lang/* → resources/lang/
  4. 移動 app/views/* → resources/views/
  5. 控制器加入 namespace App\Http\Controllers;,移至 app/Http/Controllers/
  6. Models 移至 app/Models/,加入 namespace App\Models;
  7. Filters 改寫為 Middleware 類別,註冊至 Kernel.php
  8. composer.json 更新 psr-4 映射,執行 composer dump-autoload
  9. 路由檔案語法調整(Route::controller 命名空間相對於 App\Http\Controllers)
  10. 執行 php artisan route:cache 驗證

Laravel 5 的架構變革奠定了至今(Laravel 11)仍沿用的核心設計哲學:**關注點分離、依賴注入、介面導向、HTTP 層純淨化**。深入理解這些變化,能幫助你寫出更符合框架慣例、可維護性更高的應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved