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

Laravel 5.1 核心功能速覽:路由、中介層、Blade 模板與服務容器

     編輯:PHP 相關知識

Laravel 5.1 核心架構解析:從請求進入到響應輸出的完整鏈路

Laravel 5.1 作為首個長期支援(LTS)版本,奠定了現代 Laravel 架構基石。本文系統梳理其四大核心支柱:路由系統、中介層管道、Blade 編譯引擎、服務容器與依賴注入,並附上原始碼級別的關鍵流程解析。

1. 路由系統:從 URI 到 Controller Action

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')
?>

路由匹配流程(簡化版)

  1. Kernel::handle() 接收 Request
  2. Router::dispatch() 遍歷 RouteCollection
  3. 依序嘗試 Route::matches(Request):
    • HTTP 方法匹配
    • URI 模式匹配(正則編譯後的 compiled->regex)
    • 域名/子域名/前綴限制
  4. 匹配成功 → Route::run() → 執行中介層 → 呼叫 Controller/Closure → 回傳 Response
  5. 無匹配 → 拋出 NotFoundHttpException

2. 中介層:洋蔥模型的請求過濾器

中介層提供優雅的切面機制,實現認證、日誌、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;
}

3. Blade 模板引擎:編譯為原生 PHP

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

4. 服務容器:依賴注入的核心

容器 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」等反模式。

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