iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0

剛開始接觸 Laravel 時,簡直是各種 magic ~ 完全不理解為什麼這裡寫這樣、那裡就會出現相對應的東西…因此這篇先來講些專有名詞、以及當使用者送出一個請求後會經歷的生命週期。

不過說實在的,了解生命週期的目的,大概是出現錯誤時,或是真的做了一兩個專案後,才會比較有感。可以先看一下觀念,報錯時再來看圖思考。

核心術語

Autoloader(自動載入器)

Autoloader 是一個工具,它負責根據類別的名稱自動加載相應的類別文件。在 Laravel 中,Composer Autoloader 負責自動載入應用程序中使用的類別,使你無需手動引入類別文件。

// public/index.php 使用 autoload
require __DIR__ . '/vendor/autoload.php';

// class 就可以用 use 引入
use SomeVendor\SomePackage\SomeClass;
$instance = new SomeClass();

Kernel(核心)

核心是 Laravel 框架的一個重要組件,有兩種類型,即 HTTP Kernel 和 Console Kernel。HTTP Kernel 負責處理來自 Web 的 HTTP 請求,而 Console Kernel 負責處理命令行請求。這些核心充當了整個應用程序的入口,負責協調請求處理流程。
https://ithelp.ithome.com.tw/upload/images/20230921/201628930LYJsiNsmC.png

  1. HTTP Kernel

    HTTP Kernel 的檔案位於 app/Http/Kernel.php 中。你可以在這個檔案中找到 Illuminate\Foundation\Http\Kernel 類別的擴展,並在其中定義 HTTP Kernel 中的中介件和全局中介件(Global Middleware)以及其他相關的設定。

  2. Console Kernel

    Console Kernel 的檔案位於 app/Console/Kernel.php 中。這個檔案包含了 Illuminate\Foundation\Console\Kernel 類別的擴展,並定義了控制台核心中的命令(Artisan 命令)以及相關的設定。

Service Providers (服務提供者)

服務提供者是 Laravel 應用程序的關鍵組件之一。它們用於引導和配置應用程序的各種功能,如數據庫、路由、事件系統等。服務提供者負責註冊應用程序所需的服務和功能,使其易於擴展和維護。服務提供者在應用程序啟動時進行註冊和引導。

(我個人認為 套件的註冊和引入 更適合 ServiceProvider 的翻譯)

中文版官方文件也寫到:

Service Provider 是 Laravel 中負責啟動應用程式的中心點。不管是你自己開發的應用程式,還是 Laravel 的核心服務,都是使用 Service Provider 啟動的。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MyServiceProvider extends ServiceProvider
{
    /**
     * 註冊套件
     *
     * @return void
     */
    public function register()
    {
        // 在這裡註冊你的服務,例如數據庫連接、外部 API 客戶端等
        $this->app->bind('example', function () {
            return new ExampleService();
        });
    }

    /**
     * 引導套件
     *
     * @return void
     */
    public function boot()
    {
        // 在這裡執行引導操作,例如設定路由、設置事件監聽器等
    }
}

Dispatch Request(調度請求)

調度請求是指將傳入的 HTTP 請求根據路由規則導向到適當的處理程序,通常是控制器方法。Laravel 的路由系統負責進行請求的路由解析,並選擇適當的處理程序,以便生成響應。

  1. 你的瀏覽器發送一個 HTTP 請求到網站的伺服器,該請求包含了 URL :www.example.com/groups/123
  2. 伺服器收到請求後,它需要知道應該執行哪段程式碼以回應這個請求。調度請求可能會解析 URL,發現它對應到 "GroupsController" 控制器的 "show" 方法,並將 "123" 作為參數傳遞給這個方法。
  3. "GroupsController" 的 "show" 方法現在可以使用 "123" 這個產品編號來檢索相關的產品資訊,然後生成一個網頁響應並返回給你的瀏覽器

Router(路由器)

當談到 "Router(路由器)" 時,你可以把它想像成一個地圖,它告訴 Laravel 應用程序應該如何處理不同的 URL 請求。

路由器是 Laravel 中的一個組件,用於定義應用程序的路由規則。它決定了如何處理特定的 HTTP 請求。路由器負責將 URI 轉換為相應的控制器方法或門戶,並處理中介件。路由器是 Laravel 應用程序的核心部分,用於管理 URL 到代碼之間的映射。

Route::get('/', 'HomeController@index');
	// 當用戶訪問根目錄 / 時,應該執行 HomeController 的 index 方法
Route::get('/products', 'ProductController@index');
	// 當用戶訪問 /products 時,應該執行 ProductController 的 index 方法
Route::get('/products/{id}', 'ProductController@show');
	// 當用戶訪問 /products/{id} 時,應該執行 ProductController 的 show 方法,並且 {id} 是一個動態參數。

Laravel Request Lifecycle 請求的生命週期

https://ithelp.ithome.com.tw/upload/images/20230919/20162893pp3xG1bu9N.png

  1. User Request(使用者請求)
    • 請求的起點,使用者通過瀏覽器或其他客戶端發出 HTTP 請求。
  2. public/index.php
    • 所有請求都開始於 public/index.php 檔案,它是每個請求的入口點。
    • index.php 負責包含一些初始的程式碼以執行初始設置。
  3. bootstrap/autoload.php & bootstrap/app.php
    • bootstrap/autoload.php 載入 Composer 的自動載入器,用於自動載入應用程式所需的類和檔案。
    • bootstrap/app.php 是 Laravel 應用程式的啟動點,負責初始化並設定整個應用程式。
  4. HTTP Kernel & Console Kernel
    • Laravel 使用兩種核心(Kernel)處理不同類型的請求:
      • HTTP Kernel 負責處理 HTTP 請求,例如 Web 請求。
      • Console Kernel 負責處理命令列請求,例如 Artisan 命令。
    • 這兩個核心是每個請求的中心點,負責協調並控制請求的處理流程。
  5. Service Providers(服務提供者)
    • 服務提供者是 Laravel 應用程式的關鍵組件,負責引導和配置各種應用程序功能,如數據庫、路由、事件系統等。
    • 服務提供者在應用程式啟動時註冊並引導。
  6. Router(路由器)
    • 路由器負責定義應用程序的路由規則,決定如何處理特定的 HTTP 請求。
    • 它將 URI 轉換為適當的控制器方法或門戶,並處理中介件。
  7. MVC(Model-View-Controller)
    • Laravel 遵循 MVC 架構模式,這意味著控制器(Controller)負責處理請求,模型(Model)代表數據,視圖(View)則負責呈現數據給使用者。
    • 控制器處理請求,模型處理數據邏輯,視圖負責呈現最終的 HTML 頁面。
  8. Response(回應)
    • 最終的回應由 Laravel 生成並發送給用戶的瀏覽器或客戶端。
    • 回應可以是動態生成的 HTML 內容,JSON 數據,文件下載等。

References

  1. Laravel 中文官方文件 Request 的生命週期
  2. Laravel Request Lifecycle
  3. Laravel Request Lifecycle: the best starting point for learning Laravel

上一篇
匿名函數 / 閉包 closure
下一篇
Laravel 與 MVC 架構:Model、View、Controller
系列文
Laravel 後端菜鳥可以知道的流程概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言