跳至內容

了解前端控制器、核心與環境如何協同運作

編輯此頁

設定環境章節說明了 Symfony 如何使用環境以不同的設定來執行您的應用程式。本節將更深入地說明當您的應用程式啟動時會發生什麼事。若要介入此流程,您需要了解三個協同運作的部分:

注意

通常,您不需要定義自己的前端控制器或 Kernel 類別,因為 Symfony 提供了合理的預設實作。本文旨在說明幕後發生的事情。

前端控制器

前端控制器是一種設計模式;它是應用程式所服務的所有請求都會經過的一段程式碼。

在 Symfony Skeleton 中,此角色由 public/ 目錄中的 index.php 檔案擔任。這是處理請求時執行的第一個 PHP 腳本。

前端控制器的主要目的是建立 Kernel 的實例(稍後詳述),使其處理請求,並將產生的回應傳回瀏覽器。

由於每個請求都會透過它路由,因此前端控制器可用於在設定核心之前執行全域初始化,或使用其他功能裝飾核心。範例包括:

  • 設定自動載入器或新增額外的自動載入機制;
  • 透過使用 HttpCache 的實例包裝核心,以新增 HTTP 層級快取;
  • 啟用 Debug 元件

您可以透過在 URL 中新增前端控制器來選擇要使用的前端控制器,例如:

1
https://127.0.0.1/index.php/some/path/...

如您所見,此 URL 包含要用作前端控制器的 PHP 腳本。您可以使用它來切換到位於 public/ 目錄中的自訂前端控制器。

另請參閱

您幾乎永遠不會希望在 URL 中顯示前端控制器。這可以透過設定 Web 伺服器來達成,如設定 Web 伺服器所示。

從技術上講,在命令列上執行 Symfony 時使用的 bin/console 腳本也是前端控制器,只是它不是用於 Web,而是用於命令列請求。

核心類別

Kernel 是 Symfony 的核心。它負責設定應用程式使用的所有套件,並為它們提供應用程式的設定。然後,它會在 handle() 方法中建立服務容器,然後處理請求。

Symfony 應用程式中使用的核心擴展自 Kernel,並使用 MicroKernelTraitKernel 類別保留了一些來自 KernelInterface 的未實作方法,而 MicroKernelTrait 定義了幾個抽象方法,因此您必須全部實作它們:

registerBundles()
它必須傳回執行應用程式所需的所有套件陣列。
configureRoutes()
它將個別路由或路由集合新增至應用程式(例如,載入在某些設定檔中定義的路由)。
configureContainer()
它從設定檔或使用 loadFromExtension() 方法載入應用程式設定,也可以註冊新的容器參數和服務。

為了填補這些(小的)空白,您的應用程式需要擴展 Kernel 類別並使用 MicroKernelTrait 來實作這些方法。Symfony 預設在 src/Kernel.php 檔案中提供該核心。

此類別使用環境名稱(該名稱已傳遞至 Kernel 的 constructor 方法,並且可透過 getEnvironment() 取得)來決定要啟用哪些套件。該邏輯位於 registerBundles() 中。

您可以自由建立自己的、替代的或額外的 Kernel 變體。您只需要調整您的(或新增一個新的)前端控制器,以使用新的核心。

注意

Kernel 的名稱和位置不是固定的。當將多個核心放入單一應用程式時,因此可能需要新增額外的子目錄,例如 src/admin/AdminKernel.phpsrc/api/ApiKernel.php。重要的是您的前端控制器能夠建立適當核心的實例。

注意

Kernel 還有許多其他用途,例如覆寫預設目錄結構。但是,您很可能不需要透過擁有幾個 Kernel 實作來動態變更此類事物。

偵錯模式

Kernel 建構函式的第二個引數指定應用程式是否應在「偵錯模式」下執行。無論設定環境為何,Symfony 應用程式都可以在偵錯模式設定為 truefalse 的情況下執行。

這會影響應用程式中的許多事項,例如在錯誤頁面上顯示堆疊追蹤,或者快取檔案是否在每次請求時動態重建。雖然不是必要條件,但偵錯模式通常針對 devtest 環境設定為 true,而針對 prod 環境設定為 false

類似於設定環境,您也可以使用.env 檔案啟用/停用偵錯模式

1
2
3
# .env
# set it to 1 to enable the debug mode
APP_DEBUG=0

此值可以透過在執行命令之前傳遞 APP_DEBUG 值來覆寫命令

1
2
3
4
5
# Use the debug mode defined in the .env file
$ php bin/console command_name

# Ignore the .env file and enable the debug mode for this command
$ APP_DEBUG=1 php bin/console command_name

在內部,偵錯模式的值會變成 服務容器內使用的 kernel.debug 參數。如果您查看應用程式設定檔內部,您會看到使用的參數,例如,開啟 Twig 的偵錯模式:

1
2
3
# config/packages/twig.yaml
twig:
    debug: '%kernel.debug%'

環境

如上所述,Kernel 必須實作另一個方法 - configureContainer()。此方法負責從正確的環境載入應用程式的設定。

設定環境允許使用不同的設定執行相同的程式碼。Symfony 預設提供三個環境,分別稱為 devprodtest

更技術性地說,這些名稱只不過是從前端控制器傳遞到 Kernel 建構函式的字串。然後,可以在 configureContainer() 方法中使用此名稱來決定要載入哪些設定檔。

Symfony 的預設 Kernel 類別透過首先載入在 config/packages/* 上找到的設定檔,然後載入在 config/packages/ENVIRONMENT_NAME/ 上找到的檔案來實作此方法。如果您需要更複雜的載入設定方式,您可以自由地以不同的方式實作此方法。

環境與快取目錄

Symfony 以多種方式利用快取:應用程式設定、路由設定、Twig 範本以及更多內容都快取到儲存在檔案系統上的 PHP 物件中。

預設情況下,這些快取檔案主要儲存在 var/cache/ 目錄中。但是,每個環境都會快取其自己的一組檔案:

1
2
3
4
5
6
your-project/
├─ var/
│  ├─ cache/
│  │  ├─ dev/   # cache directory for the *dev* environment
│  │  └─ prod/  # cache directory for the *prod* environment
│  ├─ ...

有時,在偵錯時,檢查快取檔案以了解某些事物的工作方式可能會很有幫助。執行此操作時,請記住查看您正在使用的環境目錄(在開發和偵錯時最常見的是 dev/)。雖然它可能會有所不同,但 var/cache/dev/ 目錄包含以下內容:

App_KernelDevDebugContainer.php
快取的「服務容器」,代表快取的應用程式設定。
url_generating_routes.php
產生 URL 時使用的快取路由設定。
url_matching_routes.php
用於路由比對的快取設定 - 在此處查看用於將傳入 URL 比對到不同路由的已編譯正規表示式邏輯。
twig/
此目錄包含所有快取的 Twig 範本。

注意

您可以變更快取目錄位置和名稱。如需更多資訊,請閱讀文章如何覆寫 Symfony 的預設目錄結構

這份作品,包含程式碼範例,以 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本