了解前端控制器、核心與環境如何協同運作
設定環境章節說明了 Symfony 如何使用環境以不同的設定來執行您的應用程式。本節將更深入地說明當您的應用程式啟動時會發生什麼事。若要介入此流程,您需要了解三個協同運作的部分:
注意
通常,您不需要定義自己的前端控制器或 Kernel
類別,因為 Symfony 提供了合理的預設實作。本文旨在說明幕後發生的事情。
前端控制器
前端控制器是一種設計模式;它是應用程式所服務的所有請求都會經過的一段程式碼。
在 Symfony Skeleton 中,此角色由 public/
目錄中的 index.php
檔案擔任。這是處理請求時執行的第一個 PHP 腳本。
前端控制器的主要目的是建立 Kernel
的實例(稍後詳述),使其處理請求,並將產生的回應傳回瀏覽器。
由於每個請求都會透過它路由,因此前端控制器可用於在設定核心之前執行全域初始化,或使用其他功能裝飾核心。範例包括:
您可以透過在 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,並使用 MicroKernelTrait。Kernel
類別保留了一些來自 KernelInterface 的未實作方法,而 MicroKernelTrait
定義了幾個抽象方法,因此您必須全部實作它們:
- registerBundles()
- 它必須傳回執行應用程式所需的所有套件陣列。
- configureRoutes()
- 它將個別路由或路由集合新增至應用程式(例如,載入在某些設定檔中定義的路由)。
- configureContainer()
- 它從設定檔或使用
loadFromExtension()
方法載入應用程式設定,也可以註冊新的容器參數和服務。
為了填補這些(小的)空白,您的應用程式需要擴展 Kernel 類別並使用 MicroKernelTrait 來實作這些方法。Symfony 預設在 src/Kernel.php
檔案中提供該核心。
此類別使用環境名稱(該名稱已傳遞至 Kernel 的 constructor 方法,並且可透過 getEnvironment() 取得)來決定要啟用哪些套件。該邏輯位於 registerBundles()
中。
您可以自由建立自己的、替代的或額外的 Kernel
變體。您只需要調整您的(或新增一個新的)前端控制器,以使用新的核心。
注意
Kernel
的名稱和位置不是固定的。當將多個核心放入單一應用程式時,因此可能需要新增額外的子目錄,例如 src/admin/AdminKernel.php
和 src/api/ApiKernel.php
。重要的是您的前端控制器能夠建立適當核心的實例。
注意
Kernel
還有許多其他用途,例如覆寫預設目錄結構。但是,您很可能不需要透過擁有幾個 Kernel
實作來動態變更此類事物。
偵錯模式
Kernel
建構函式的第二個引數指定應用程式是否應在「偵錯模式」下執行。無論設定環境為何,Symfony 應用程式都可以在偵錯模式設定為 true
或 false
的情況下執行。
這會影響應用程式中的許多事項,例如在錯誤頁面上顯示堆疊追蹤,或者快取檔案是否在每次請求時動態重建。雖然不是必要條件,但偵錯模式通常針對 dev
和 test
環境設定為 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 預設提供三個環境,分別稱為 dev
、prod
和 test
。
更技術性地說,這些名稱只不過是從前端控制器傳遞到 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 的預設目錄結構。