應用主體是服務定位器, 它部署一組提供各種不同功能的 應用元件 來處理要求。例如,urlManager元件負責處理網頁請求路由到對應的控制器。 db元件提供資料庫相關服務等等。
在同一個應用程式中,每個應用程式元件都有一個獨一無二的ID 用來區分其他應用元件,你可以透過以下表達式存取應用程式元件。 (建議學習:yii框架)
\Yii::$app->componentID
例如,可以使用\Yii::$app->db 來取得到已註冊到應用程式的DB connection, 使用\Yii:: $app->cache 來取得到已註冊到應用程式的primary cache。
第一次使用上述表達式時候會建立應用程式元件實例, 後續再造訪會傳回此實例,無需再次建立。
應用程式元件可以是任意對象,可以在 應用主體配置配置 yii\base\Application::$components 屬性。例如:
[ 'components' => [ // 使用类名注册 "cache" 组件 'cache' => 'yii\caching\ApcCache', // 使用配置数组注册 "db" 组件 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=demo', 'username' => 'root', 'password' => '', ], // 使用函数注册"search" 组件 'search' => function () { return new app\components\SolrService; }, ], ]
資訊: 請謹慎註冊太多應用元件, 應用元件就像全域變量, 使用太多可能加大測試和維護的難度。一般情況下可以在需要時再建立本機元件。
引導啟動元件
上面提到一個應用程式元件只會在第一次造訪時實例化, 如果處理請求程序沒有存取的話就不會實例化。有時你會想在每個請求處理過程都實例化某個元件即便它不會被訪問, 可以將該元件ID加入到應用主體的 bootstrap 屬性中。
你也可以使用閉包來引導啟動自訂的元件。不需要直接傳回一個實例化的元件。在應用主體 yii\base\Application 實例化後,閉包也會被呼叫。
例如, 如下的應用程式主體配置保證了 log 元件一直被載入。
[ 'bootstrap' => [ 'log', function($app){ return new ComponentX(); }, function($app){ // 可以写自定义的代码 return; } ], 'components' => [ 'log' => [ // "log" 组件的配置 ], ], ]
核心應用程式元件
Yii 定義了一組固定ID和預設設定的核心元件, 例如request 元件用來收集使用者請求並解析路由;db 代表一個可以執行資料庫操作的資料庫連線。透過這些元件,Yii應用主體能處理使用者請求。
下面是預先定義的核心應用程式元件列表, 可以和普通應用程式元件一樣配置和自訂它們。當你配置一個核心元件,不指定它的類別名稱的話就會使用Yii預設指定的類別。
以上是yii框架應用元件是服務定位器嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!