阿江 2017-10-12 16:19:43 2603次浏览 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
*/

(全文完)

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