Laravel 5.1 作為首個長期支援(LTS)版本,奠定了現代 Laravel 架構基石。本文系統梳理其四大核心支柱:路由系統、中介層管道、Blade 編譯引擎、服務容器與依賴注入,並附上原始碼級別的關鍵流程解析。
Laravel 路由定義於 app/Http/routes.php(5.3+ 移至 routes/web.php)。核心類:Illuminate\Routing\Router。
<?php
// 閉包路由(簡單邏輯)
Route::get('/', function () {
return view('welcome');
});
// 控制器路由(推薦)
Route::get('users/{id}', 'UserController@show');
Route::post('users', 'UserController@store');
// 資源路由(一鍵生成 RESTful 七大動作)
Route::resource('photos', 'PhotoController');
// 群組與中介層
Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function () {
Route::get('dashboard', 'Admin\DashboardController@index');
});
// 命名路由(反向生成 URL)
Route::get('profile', 'UserController@profile')->name('profile');
// 使用:route('profile')、redirect()->route('profile')
?>
Kernel::handle() 接收 RequestRouter::dispatch() 遍歷 RouteCollectionRoute::matches(Request):compiled->regex)Route::run() → 執行中介層 → 呼叫 Controller/Closure → 回傳 ResponseNotFoundHttpException中介層提供優雅的切面機制,實現認證、日誌、CORS、限流、CSRF 等橫切關注點。
php artisan make:middleware CheckAge
// app/Http/Middleware/CheckAge.php
public function handle($request, Closure $next) {
if ($request->age < 18) return redirect('home');
return $next($request); // 傳遞給下一層
}
<?php
// app/Http/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'age' => \App\Http\Middleware\CheckAge::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
// 路由中使用
Route::get('bar', function () {})->middleware('age');
Route::group(['middleware' => ['auth', 'throttle:60,1']], function () {});
// 請求進入方向:Middleware A → Middleware B → Controller
// 響應返回方向:Controller → Middleware B → Middleware A
// 程式碼視角:
public function handle($request, Closure $next) {
// 前置邏輯(請求進入時)
$response = $next($request); // 執行下一層(可能是下一個中介層或控制器)
// 後置邏輯(響應返回時)
return $response;
}
Blade 檔案 .blade.php 經編譯器 Illuminate\View\Compilers\BladeCompiler 轉換為純 PHP 類別,緩存於 storage/framework/views。
| Blade 語法 | 編譯後 PHP |
|---|---|
{{ $var }} | (自動 HTML 轉義) |
{!! $html !!} | (原始輸出,慎用) |
@if @else @endif | ... |
@foreach @endforeach | ... |
@include('partial') | make('partial')->render(); ?> |
@yield('section') | yieldContent('section'); ?> |
@section('s') ... @show | 定義區塊內容 |
@extends('layout') | 繼承佈局模板 |
@component('alert', ['type'=>'error']) | 元件化渲染(5.4+) |
<?php
// AppServiceProvider::boot()
Blade::directive('datetime', function ($expression) {
return "format('Y-m-d H:i:s'); ?>";
});
// 視圖中使用:@datetime($user->created_at)
?>
容器 Illuminate\Container\Container 管理類別依賴解析、綁定、單例、上下文綁定。
<?php
// 綁定介面到實作
$this->app->bind(RepositoryInterface::class, EloquentRepository::class);
// 單例(全程共用同一實例)
$this->app->singleton(ApiClient::class, function ($app) {
return new ApiClient(config('services.api.key'));
});
// 實例綁定(手動注入已建立物件)
$this->app->instance('request', $request);
// 上下文綁定(不同控制器注入不同實作)
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(LocalFilesystem::class);
$this->app->when(VideoController::class)
->needs(Filesystem::class)
->give(S3Filesystem::class);
<?php
class UserController extends Controller {
// 建構子注入:容器自動解析 UserRepository、Request
public function __construct(
protected UserRepository $users,
protected Request $request
) {}
// 方法注入:僅此方法需要的服務
public function store(ValidatorFactory $validator) {
$validator->make($this->request->all(), [...])->validate();
}
}
public/index.php
↓
require bootstrap/app.php → 建立 Application (Container)
↓
$kernel = $app->make(Kernel::class)
↓
$response = $kernel->handle($request = Request::capture())
↓
├── Bootstrap: LoadEnvironment, LoadConfiguration, RegisterProviders, BootProviders
↓
├── Middleware Pipeline (global): TrustProxies, HandleCors, PreventMaintenanceMode, TrimStrings, ConvertEmptyStringsToNull
↓
├── Router::dispatch($request)
│ ├── Route::matches($request) → 找到 Route
│ ├── Route::run() → 執行 Route Middleware → Controller@method
│ │ ├── Controller 依賴注入 (Container 解析)
│ │ ├── 執行業務邏輯
│ │ └── 回傳 Response / View / JsonResponse
│ └── Route Middleware (after)
↓
├── Middleware Pipeline (after): 修改 Response 標頭、記錄日誌等
↓
$response->send() → 輸出 HTTP 響應
↓
$kernel->terminate($request, $response) → 可終止中介層
Laravel 5.1 的優雅源於嚴格的職責分離:路由負責映射、中介層負責過濾、控制器負責協調、服務層負責業務、模板負責呈現、容器負責解耦。掌握這四大支柱的運作機制,才能在複雜專案中游刃有餘,避免「胖控制器」、「邏輯散落在路由閉包」、「濫用 Facade」等反模式。