别名(Alias)
可以将别名视为特殊的常量变量。ii中、别名以@别名的定义一般放在应用的最开始的阶段进行,比如引导阶段、初始化阶段等开头,以区别于正常的文件路径和URL。
一、预定义别名
yii\BaseYii::$aliases 用于保存整个Yii应用的所有的别名。
var_dump(yii\BaseYii::$aliases);die;打印所有别名,等价于如下:
use Yii;
var_dump(Yii::$aliases);die;
{
@yii: {
@yii/swiftmailer: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-swiftmailer",
@yii/redis: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-redis/src",
@yii/queue/sync: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/sync",
@yii/queue/sqs: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/sqs",
@yii/queue/redis: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/redis",
@yii/queue/gearman: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/gearman",
@yii/queue/file: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/file",
@yii/queue/db: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/db",
@yii/queue/beanstalk: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/beanstalk",
@yii/queue/amqp_interop: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/amqp_interop",
@yii/queue/amqp: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src/drivers/amqp",
@yii/queue: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-queue/src",
@yii/httpclient: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-httpclient/src",
@yii/gii: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-gii/src",
@yii/faker: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-faker",
@yii/debug: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-debug/src",
@yii/bootstrap: "/Users/xiafen/web/organa/vendor/yiisoft/yii2-bootstrap/src",
@yii: "/Users/xiafen/web/organa/vendor/yiisoft/yii2"
},
@app: "/Users/xiafen/web/organa",
@vendor: "/Users/xiafen/web/organa/vendor",
@bower: "/Users/xiafen/web/organa/vendor/bower-asset",
@npm: "/Users/xiafen/web/organa/vendor/npm-asset",
@runtime: "/data0/www/cache/organa.intra.lianjia.com",
@privdata: "/data0/www/privdata/organa.intra.lianjia.com",
@webroot: "/Users/xiafen/web/organa/web",
@web: "",
@m35: {
@m35/thecsv: "/Users/xiafen/web/organa/vendor/m35/thecsv"
},
@yii2tech: {
@yii2tech/spreadsheet: "/Users/xiafen/web/organa/vendor/yii2tech/spreadsheet/src"
}
}
所有预定义的别名:
默认预定义别名一共有12个,其中路径别名11个,URL别名只有 @web 1个:
@yii 表示Yii框架所在的目录,也是 yii\BaseYii 类文件所在的位置;
@app 表示正在运行的应用的根目录,一般是 digpage.com/frontend ;
@vendor 表示Composer第三方库所在目录,一般是 @app/vendor 或 @app/../vendor ;
@bower 表示Bower第三方库所在目录,一般是 @vendor/bower ;
@npm 表示NPM第三方库所在目录,一般是 @vendor/npm ;
@runtime 表示正在运行的应用的运行时用于存放运行时文件的目录,一般是 @app/runtime ;
@webroot 表示正在运行的应用的入口文件 index.php 所在的目录,一般是 @app/web;
@web URL别名,表示当前应用的根URL,主要用于前端;
@common 表示通用文件夹;
@frontend 表示前台应用所在的文件夹;
@backend 表示后台应用所在的文件夹;
@console 表示命令行应用所在的文件夹;
其他使用Composer安装的Yii扩展注册的二级别名。
这样,在整个Yii应用中,只要使用上述别名,就可方便、且统一地表示特定的路径或URL。
二、预定义别名的分布
预定义别名在vendor里定义
自定义别名一般放在config/下的某个配置文件当中定义
return array(
......
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
'@privdata' => env('MATRIX_PRIVDATA_DIR', '@runtime/privdata/'),
],
......
);
(1)配置文件的别名
别名一般放在 digpage.com\common\config\bootstrap.php , 或者 digpage.com\frontend\config\bootstrap.php 等 bootstrap.php 文件中定义,也可以自己在 bootstrap.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');
(2)Yii预定义的别名
主要分布在 yii\BaseYii 和 yii\base\Application 等类中。这类别名直接写到Yii的代码中去,一般不去修改他。
如:在yii\BaseYii 中:
// 定义@yii作为yii\BaseYii.php的别名
public static $aliases = ['@yii' => __DIR__];
又如:yii\base\Application 在其构造函数 __construct()中
(3)扩展中的别名
Yii的扩展(extensions)。 当使用Composer安装扩展后,会向 @vendor/yiisoft/extensions.php 写入信息,其中就包含相应的别名。 只不过这些别名通常都是二级别名。然后,在 yii\base\Application::bootstrap() 中,将这些扩展的别名进行注册。
三、别名的定义与解析
(1)定义和解析别名
Yii使用 Yii::$aliases[] 来保存别名, 定义别名就是将别名及其代表的实际路径或URL写入这个数组, 而解析别名就是将别名的信息从数组读取出去并组合。
(2)别名的定义过程
// 使用一个路径定义一个路径别名
Yii::setAlias('@foo', 'path/to/foo');
// 使用一个URL定义一个URL别名
Yii::setAlias('@bar', 'http://www.example.com');
// 使用一个别名定义另一个别名
Yii::setAlias('@fooqux', '@foo/qux');
// 定义一个“二级”别名
Yii::setAlias('@foo/bar', 'path/to/foo/bar');