# Yii的路徑別名
**別名(Alias)** 可以將別名視為特殊的常量變量,他的作用在于避免將一些文件路徑、URL以硬編碼的方式 寫入代碼中,或者多處出現一長串的文件路徑、URL。
## 預定義的別名
Yii中,別名以`@`開頭,以區別于正常的文件路徑和URL。Yii中預定義了許多常用的 別名。別名的定義一般放在應用的最開始的階段進行,比如引導階段、初始化階段等。 這樣可以保證后續代碼可以使用這些定義好的別名。
別名一般放在`<project>\common\config\bootstrap.php`, 或者在yii2高級版中`<project>\frontend\config\bootstrap.php`等`bootstrap.php`文件中定義。比如:
```php
<?php
Yii::setAlias('common', dirname(__DIR__));
Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');
```
在此定義的別名通過入口腳本引入Yii應用中,具體可以看看入口文件`index.php`部分的內容。上面的`<project>/common/config/bootstrap.php`文件定義了`@common`,`@frontend`,`@backend`和`@console`4個別名。 我們也可以自己在`bootstrap.php`中加入自己的別名定義,這是最常運用的定義別名的方式。
## Yii預定義的別名
Yii預定義的別名主要分布在 `yii\BaseYii` 和 `yii\base\Application` 等類中。
默認情況下,會有:
- `@app` ,必須由開發者在配置文件中提供,一般為配置文件的`dirname(__DIR__)` 。 即 `<project>/frontend` 之類的目錄。
- `@vendor` ,一般定義為 `@app/vendor` ,高級模板中則定義為`@app/../vendor`
- `@bower` ,定義為 `@vendor/bower`
- `@npm` ,定義為 `@vendor/npm`
- `@runtime` ,定義為 `@app/runtime`
### 所有預定義的別名[](http://www.digpage.com/aliases.html#id3 "Permalink to this headline")
小結一下,默認預定義別名一共有12個,其中路徑別名11個,URL別名只有`@web`1個:
* `@web`URL別名,表示當前應用的根URL,主要用于前端;
* `@yii`表示Yii框架所在的目錄,也是`yii\BaseYii`類文件所在的位置;
* `@app`表示正在運行的應用的根目錄,一般是`<project>/frontend`;
* `@vendor`表示Composer第三方庫所在目錄,一般是`@app/vendor`或`@app/../vendor`;
* `@bower`表示Bower第三方庫所在目錄,一般是`@vendor/bower`;
* `@npm`表示NPM第三方庫所在目錄,一般是`@vendor/npm`;
* `@runtime`表示正在運行的應用的運行時用于存放運行時文件的目錄,一般是`@app/runtime`;
* `@webroot`表示正在運行的應用的入口文件`index.php`所在的目錄,一般是`@app/web`;
* `@common`表示通用文件夾;
* `@frontend`表示前臺應用所在的文件夾;
* `@backend`表示后臺應用所在的文件夾;
* `@console`表示命令行應用所在的文件夾;
* 其他使用Composer安裝的Yii擴展注冊的二級別名,比如在`extensions.php`中key為`alias`的值。
這樣,在整個Yii應用中,只要使用上述別名,就可方便、且統一地表示特定的路徑或URL。
## 別名的定義過程
### 使用其他的方式定義別名
```
// 使用一個路徑定義一個路徑別名
Yii::setAlias('@foo', 'path/to/foo');
// 使用一個URL定義一個URL別名
Yii::setAlias('@bar', 'http://www.domain.com');
// 使用一個別名定義另一個別名
Yii::setAlias('@fooba', '@foo/ba');
// 定義一個“二級”別名
Yii::setAlias('@foo/bar', 'path/to/foo/bar');
```
### 別名規范化
如果要定義的別名`$alias`并非以`@`打頭,自動為這個別名加上`@`前綴。 總之,只要是別名,必然以`@`打頭。下面的兩個語句,都定義了相同的別名`@foo`
```php
Yii::setAlias('foo', 'path/to/foo');
Yii::setAlias('@foo', 'path/to/foo');
```
### 獲取根別名
`$alias`的根別名,就是`@`加上第一個`/`之間地內容,以`$root`表示。 這里可以看出,別名是分層次的。下面3個語句的根別名都是`@foo
```php
Yii::setAlias('@foo', 'path/to/some/where');
Yii::setAlias('@foo/bar', 'path/to/some/where');
Yii::setAlias('@foo/bar/qux', 'path/to/some/where');
```
### 新定義別名還是刪除別名
如果傳入的`$path`不是`null`,說明是正常的別名定義。 對于正常的別名定義,就是往`BaseYii::$aliases[]`里寫入信息。 而如果`$path`為`null`,說明是要刪除別名:
```php
// 定義別名@foo
Yii::setAlias('@foo', 'path/to/some/where');
// 刪除別名@foo
Yii::setAlias('@foo', null);
```
### 解析`$path`
對于新定義別名,既然`$path`不為`null`,那么先進行解析: 如果`$path`以`@`打頭,說明這也是一個別名,則調用`Yii::getAlias()`, 并將解析后的結果作為新的`$path`; 如果`$path`不以`@`打頭,說明是一個正常的path 或 URL, 那么去除`$path`末尾的`/`和`\`。
### 別名的寫入
對于全新的別名,也即其根別名是新的,`BaseYii::aliases[$root]`不存在。 那么全新別名的寫入分兩種情況: 如果全新別名本身就是根別名,那么直接`BaseYii::aliases[$alias]`=`$path`; 而如果全新的別名并非是一個根別名,即形如`@foo/bar`帶有二級、三級等路徑的,`BaseYii::aliases[$root]=[$alias=>$path]`。比如:
```php
// BaseYii::aliases['@foo'] = ['@foo/bar' => 'path/to/foo/bar']
Yii::setAlias('@foo/bar', 'path/to/foo/bar');
// BaseYii::aliases['@qux'] = 'path/to/qux'
Yii::setAlias('@qux', 'path/to/qux');
```
### 別名的刪除
傳入的 `$path` 為 `null` 表示要刪除別名。 Yii使用PHP的 `unset()` 注銷 `BaseYii::$aliases[]` 數組中的對應元素, 達到刪除別名的目的。注意刪除別名后,不需要調用 `krsort()`對數組進行處理。
參考:[Yii約定Alias別名](http://www.digpage.com/aliases.html)
- 開始
- Yii2開發小技巧
- Yii2使用不同的方式進行郵件發送邏輯處理
- Yii2 Serialization of 'Closure' is not allowed 錯誤
- Yii創建應用
- Yii應用結構和流程
- Yii的路徑別名
- Yii的請求
- Yii的響應
- Sessions 和 Cookies
- Yii自定義全局工具函數
- Yii2模型
- Yii2視圖
- Yii2控制器
- 大數據節省內存處理
- 關聯查詢hasMany、hasOne
- Yii2 URL地址美化
- Yii2整合AdminLTE后臺主題
- Yii2模型中的場景
- Yii2中的RBAC
- Yii2項目后臺整合yii2-admin模塊
- RBAC集成AdminLTE后臺主題對菜單進行控制
- Yii2自定義Gii模板
- 修復AdminLTE引用外部字體文件導致訪問變慢的情況
- Yii2事件簡單使用
- Yii2模型事件
- Yii2使用GridView新增操作按鈕
- Yii2向loyout模板文件中傳值
- Yii2數據緩存
- Yii2緩存
- Yii2數據緩存之增刪改查
- Yii2拓展
- Yii2日期時間插件-datetimepicker
- kartik-v/yii2-widget-fileinput上傳插件