阿江 2017-10-12 16:19:43 76次浏览 0条回复 0 0 0

说明

学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!

原文网址:

http://www.yiiframework.com/doc-2.0/guide-concept-aliases.html

本文主题:别名(Aliases)

别名用于代表文件路径或URL,这样就无需在项目中使用硬代码(hard-code)的绝对路径和URL了。一个别名与普通文件路径或URL不同,它必须使用@字符开头。定义的别名如果没有@字符将会被自动添加。
Yii有许多预定义(pre-defined)的别名可以使用,例如,@yii别名代表Yii框架的安装路径;@web代表当前运行的Web应用的base URL。

1、Defining Aliases(定义别名)

我们可以调用Yii::setAlias()为文件路径或URL定义一个别名:

//为文件路径(file path)定义一个别名
Yii::setAlias('@foo','/path/to/foo');
//为URL定义一个别名
Yii::setAlias('@bar','http//www.example.com');

注意:被定义为别名的文件路径或URL不一定是已存在的文件或资源。

对于一个已定义的别名,无需调用Yii::setAlias(),在其后追加一个正斜杠(/)和路径的其他部分,我们就可以衍生(derive)一个新的别名。使用Yii::setAlias()定义的别名是根别名(root alias),例如:@foo是一个根别名,@foo/bar/file.php是一个衍生别名(derived alias)。

我们可以使用一个别名定义另外一个别名(无论是根别名还是子别名):

Yii::setAlias('@foobar','@foo/bar');

根别名通常在引导(bootstrapping)状态过程中定义,例如,我们可以在入口脚本中调用Yii::setAlias()。通常应用提供了一个名为aliases的可写属性,我们可以在应用配置中配置它:

return[
	'aliases'=>[
		'@foo'=>'/path/to/foo',
		'@bar'=>'http://www.example.com',
	],
];

2、Resolving Aliases(解析别名)

我们可以调用Yii::getAlias()解析一个根别名为文件路径或URL,同样它也可以解析一个衍生别名:

echo Yii::getAlias('@foo');
echo Yii::getAlias('@bar');
echo Yii::getAlias('@foo/bar/file.php');

衍生路径或URL的解析是将根别名替换之后再加上后续部分组成的。
注意:Yii::getAlias()方法并不检测路径或URL是否存在真实的对应关系。

一个根别名可以包含正斜线/,Yii::getAlias()方法可以自动判断别名中的根别名,这样就可以正确分辨出剩余的路径或URL了。

Yii::setAlias('@foo', '/path/to/foo');
Yii::setAlias('@foo/bar', '/path2/bar');
Yii::getAlias('@foo/test/file.php');  // displays: /path/to/foo/test/file.php
Yii::getAlias('@foo/bar/file.php');   // displays: /path2/bar/file.php

如果@foo/bar没有定义为根别名,最后一句代码将显示为/path/to/foo/bar/file.php

3、Using Aliases(使用别名)

无需调用Yii::getAlias(),别名就可以在很多地方被自动识别为路径或URL,例如:yii\caching\FileCache::$cachePath 可以接受文件路径或使用别名表示的文件路径,这要归功于使用@前缀即可区分文件路径和别名路径。

use yii\caching\FileCache;
$cache=new FileCache([
	'cachePath'=>'@runtime/cache',
]);

具体情况时,请参见API文档查看一个属性或方法参数是否支持别名。

4、Predefined Aliases(预定义的别名)

Yii定义了一些可以轻松被引用的公共别名:
@yii,BaseYii.php文件所在的目录,也被称为Yii框架目录
@app,当前运行应用的基础路径(base path)
@runtime,当前运行应用的运行时目录(runtime path),默认值@app/runtime
@webroot,当前运行应用的Web根目录(Web root directory),也就是入口脚本所在的目录。
@web,当前运行Web应用的基础URL(base URL),此值和yii\web\Request::$baesUrl 相同
@vendor,Composer Vendor目录,默认值为@app/vendor
@bower,包含bower包的根目录,默认值是@vendor/bower
@npm,包含npm包的根目录,默认值是@vendor/npm

@yii是你在入口脚本中包含Yii.php时定义的别名,其他别名是在应用构造器使用应用配置时定义。

5、Extension Aliases(扩展的别名)

通过Composer安装的扩展都会自动定义别名,每个别名以其composer.json文件中声明的扩展的根命名空间命名,每个别名代表扩展包的根目录。例如,你安装了yiisoft/yii2-jui扩展,你会自动获取到@yii/jui的别名,此别名是在引导过程(bootstrapping stage)中定义的,等效于:

Yii::setAlias('@yii/jui','VendorPath/yiisoft/yii2-jui');

//-----------------------------------------------

Aliases实例

//----------------
//实例:自动识别根别名
D:\phpwork\advanced\frontend\controllers\PostController.php

    public function actionAlias(){
        echo "---alias---";
        Yii::setAlias('@foo', '/path/to/foo');
        echo "<br>@foo/bar/file.php:".Yii::getAlias('@foo/bar/file.php');   // displays: /path/to/foo/bar/file.php
        Yii::setAlias('@foo/bar', '/path2/bar');
        echo "<br>@foo/bar/file.php:".Yii::getAlias('@foo/bar/file.php');   // displays: /path2/bar/file.php
        echo "<br>@foo/test/file.php:".Yii::getAlias('@foo/test/file.php');  // displays: /path/to/foo/test/file.php
    }

测试结果:

http://localhost:8082/post/alias
/*
---alias---
@foo/bar/file.php:/path/to/foo/bar/file.php
@foo/bar/file.php:/path2/bar/file.php
@foo/test/file.php:/path/to/foo/test/file.php
*/

//----------------
//实例:定义根别名
D:\phpwork\advanced\common\config\bootstrap.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::setAlias('@commands', dirname(dirname(__DIR__)) . '/commands');
Yii::setAlias('@root', dirname(dirname(__DIR__)));

D:\phpwork\advanced\frontend\controllers\PostController.php

    public function actionAlias(){
        echo "alias<br>";
        Yii::setAlias('foo','/asd');
        Yii::setAlias('bar','/abc');
        echo "<br>@root:".Yii::getAlias('@root');
        echo "<br>@foo:".Yii::getAlias('@foo');
        echo "<br>@bar:".Yii::getAlias('@bar');
        echo "<br>@foo/bar/file.php:".Yii::getAlias('@foo/bar/file.php');
    }

测试结果:

http://localhost:8082/post/alias
/*
alias
@root:D:\phpwork\advanced
@foo:/asd
@bar:/abc
@foo/bar/file.php:/asd/bar/file.php
*/

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册