彆名(Aliases)
彆名(Aliases)
彆名用來表示文件路徑和 URL,這樣就避免了在代碼中硬編碼一些絕對路徑和 URL。一個彆名必須以 @
字符開頭,以區彆於傳統的文件路徑和 URL。Yii 預定義了大量可用的彆名。例如,彆名 @yii
指的是 Yii 框架本身的安裝目錄,而 @web
表示的是當前運行應用的根 URL。
定義彆名
你可以調用 [[Yii::setAlias()]] 來給文件路徑或 URL 定義彆名:
- // 文件路徑的彆名
- Yii::setAlias('@foo', '/path/to/foo');
- // URL 的彆名
- Yii::setAlias('@bar', 'http://www.example.com');
注意:彆名所指向的文件路徑或 URL 不一定是真實存在的文件或資源。
可以通過在一個彆名後麵加斜杠 /
和一至多個路徑分段生成新彆名(無需調用 [[Yii::setAlias()]])。我們把通過 [[Yii::setAlias()]] 定義的彆名稱為根彆名,而用他們衍生出去的彆名成為衍生彆名。例如,@foo
就是跟彆名,而 @foo/bar/file.php
是一個衍生彆名。
你還可以用彆名去定義新彆名(根彆名與衍生彆名均可):
- Yii::setAlias('@foobar', '@foo/bar');
根彆名通常在引導階段定義。比如你可以在入口腳本裡調用 [[Yii::setAlias()]]。為了方便起見,應用提供了一個名為 aliases
的可寫屬性,你可以在應用配置中設置它,就像這樣:
- return [
- // ...
- 'aliases' => [
- '@foo' => '/path/to/foo',
- '@bar' => 'http://www.example.com',
- ],
- ];
解析彆名
你可以調用 [[Yii::getAlias()]] 命令來解析根彆名到對應的文件路徑或 URL。同樣的頁麵也可以用於解析衍生彆名。例如:
- echo Yii::getAlias('@foo'); // 輸出:/path/to/foo
- echo Yii::getAlias('@bar'); // 輸出:http://www.example.com
- echo Yii::getAlias('@foo/bar/file.php'); // 輸出:/path/to/foo/bar/file.php
由衍生彆名所解析出的文件路徑和 URL 是通過替換掉衍生彆名中的根彆名部分得到的。
注意:[[Yii::getAlias()]] 並不檢查結果路徑/URL 所指向的資源是否真實存在。
根彆名可能也會包含斜杠 /
。[[Yii::getAlias()]] 足夠智能到判斷一個彆名中的哪部分是根彆名,因此能正確解析文件路徑/URL。例如:
- Yii::setAlias('@foo', '/path/to/foo');
- Yii::setAlias('@foo/bar', '/path2/bar');
- echo Yii::getAlias('@foo/test/file.php'); // 輸出:/path/to/foo/test/file.php
- echo Yii::getAlias('@foo/bar/file.php'); // 輸出:/path2/bar/file.php
若 @foo/bar
未被定義為根彆名,最後一行語句會顯示為 /path/to/foo/bar/file.php
。
使用彆名
彆名在 Yii 的很多地方都會被正確識彆,無需調用 [[Yii::getAlias()]] 來把它們轉換為路徑/URL。例如,[[yii\caching\FileCache::cachePath]] 能同時接受文件路徑或是指向文件路徑的彆名,因為通過 @
前綴能區分它們。
- use yii\\caching\\FileCache;
- $cache = new FileCache([
- 'cachePath' => '@runtime/cache',
- ]);
請關注 API 文檔了解特定屬性或方法參數是否支持彆名。
預定義的彆名
Yii 預定義了一係列彆名來簡化常用路徑和 URL的使用:
- @yii - BaseYii.php 文件所在的目錄(也被稱為框架安裝目錄)
- @app - 當前運行的應用 [[yii\base\Application::basePath|根路徑(base path)]]
- @runtime - 當前運行的應用的 [[yii\base\Application::runtimePath|運行環境(runtime)路徑]]
- @vendor - [[yii\base\Application::vendorPath|Composer 供應商目錄]]
- @webroot - 當前運行應用的 Web 入口目錄
- @web - 當前運行應用的根 URL
@yii
彆名是在入口腳本裡包含 Yii.php
文件時定義的,其他的彆名都是在配置應用的時候,於應用的構造方法內定義的。
擴展的彆名
每一個通過 Composer 安裝的 擴展 都自動添加了一個彆名。該彆名會以該擴展在 composer.json
文件中所聲明的根命名空間為名,且他直接代指該包的根目錄。例如,如果你安裝有 yiisoft/yii2-jui
擴展,會自動得到 @yii/jui
彆名,它定義於引導啟動階段:
- Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui');