From e5023cbf76f3611c67214b19a47af9b349aff095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E6=96=B9=E5=AD=A4=E6=80=9D=E5=AD=90=EF=BC=88Pari?= =?UTF-8?q?s=C2=B7QianSen=EF=BC=89?= Date: Wed, 2 Jul 2014 03:16:41 +0800 Subject: [PATCH] translate concept-aliases and autoloading [skip cii] --- docs/guide-zh-CN/concept-aliases.md | 119 ++++++++++++++++++++++++ docs/guide-zh-CN/concept-autoloading.md | 92 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 docs/guide-zh-CN/concept-aliases.md create mode 100644 docs/guide-zh-CN/concept-autoloading.md diff --git a/docs/guide-zh-CN/concept-aliases.md b/docs/guide-zh-CN/concept-aliases.md new file mode 100644 index 0000000000..2143926429 --- /dev/null +++ b/docs/guide-zh-CN/concept-aliases.md @@ -0,0 +1,119 @@ +路径别名(Aliases) +======= + +路径别名(Path Alias 简称别名)用作代表文件路径和 URL,主要为了避免在代码中硬编码一些绝对路径和 +URL。一个别名必须以 `@` 字符开头,以区别于传统的文件/目录路径或 URL。举栗,别名 `@yii` +指的是 Yii 框架本身的安装目录,而 `@web` 表示的是当前运行应用的根 URL(base URL)。 + + +定义别名 +---------------- + +你可以调用 [[Yii::setAlias()]] 来给指定路径/URL 定义别名。栗子: + +```php +// 文件路径的别名 +Yii::setAlias('@foo', '/path/to/foo'); + +// URL 的别名 +Yii::setAlias('@bar', 'http://www.example.com'); +``` + +> 注意:别名所指向的文件路径或 URL 不一定是真实存在的文件或资源哦。 + +用一个别名,你能通过在后面接续斜杠 `/` 以及若干路径片段得到一个新的别名(无需调用 +[[Yii::setAlias()]])。我们把通过 [[Yii::setAlias()]] 定义的别名成为根别名 +*root aliases*,而用他们衍生出去的别名成为衍生别名 *derived aliases*。比如,`@foo` 就是跟别名,而 `@foo/bar/file.php` +是一个衍生别名。 + +你还可以用别名定义新别名(根别名与衍生别名均可): + +```php +Yii::setAlias('@foobar', '@foo/bar'); +``` + +根别名通常在 [引导(bootstrapping)](runtime-bootstrapping.md) 阶段定义。比如你可以在 +[入口脚本](structure-entry-scripts.md) 里调用 [[Yii::setAlias()]]。为了方便起见呢,[应用主体(Application)](structure-applications.md) +提供了一个名为 `aliases` 的可写属性,你可以在应用[配置文件](concept-configurations.md)中设置它,就像这样: + +```php +return [ + // ... + 'aliases' => [ + '@foo' => '/path/to/foo', + '@bar' => 'http://www.example.com', + ], +]; +``` + + +解析别名 +----------------- + +你可以调用 [[Yii::getAlias()]] 命令来解析一个根别名到他所对应的文件路径或 URL。同样的页面也可以用于解析衍生别名。比如: + +```php +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。比如: + +```php +Yii::setAlias('@foo', '/path/to/foo'); +Yii::setAlias('@foo/bar', '/path2/bar'); +Yii::getAlias('@foo/test/file.php'); // 显示:/path/to/foo/test/file.php +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]] 能同时接受文件路径或是代表文件路径的别名,多亏了 `@` 前缀,它区分开了文件路径与别名。 + +```php +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` 别名是在[入口脚本](structure-entry-scripts.md)里包含 `Yii.php` 文件时定义的,其他的别名都是在[配置应用](concept-configurations.md)的时候,于应用的构造器内定义的。 + + +扩展的别名 +----------------- + +每一个通过 Composer 安装的 [扩展](structure-extensions.md) 都自动添加了一个别名。该别名会以该扩展在 `composer.json` +文件中所声明的根命名空间为名,且他直接代指该包的根目录。比如,如果你安装有 `yiisoft/yii2-jui` 扩展,你会自动得到 +`@yii/jui` 别名,它定义于[引导启动](runtime-bootstrapping.md)阶段: + +```php +Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui'); +``` \ No newline at end of file diff --git a/docs/guide-zh-CN/concept-autoloading.md b/docs/guide-zh-CN/concept-autoloading.md new file mode 100644 index 0000000000..c215994c32 --- /dev/null +++ b/docs/guide-zh-CN/concept-autoloading.md @@ -0,0 +1,92 @@ +类自动加载(Autoloading) +================= + +Yii relies on the [class autoloading mechanism](http://www.php.net/manual/en/language.oop5.autoload.php) +to locate and include required class files. It provides a high-performance class autoloader that is compliant to the +[PSR-4 标准](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md). +The autoloader is installed when you include the `Yii.php` file. + +> Note: For simplicity of description, in this section we will only talk about autoloading of classes. However, keep in + mind that the content we are describing here applies to autoloading of interfaces and traits as well. + + +使用 Yii 自动加载器 +------------------------ + +To make use of the Yii class autoloader, you should follow two simple rules when creating and naming your classes: + +* Each class must be under some namespace (e.g. `foo\bar\MyClass`). +* Each class must be saved in an individual file whose path is determined by the following algorithm: + +```php +// $className is a fully qualified class name with the leading backslash +$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php'); +``` + +For example, if a class name is `foo\bar\MyClass`, the [alias](concept-aliases.md) for the corresponding class file path +would be `@foo/bar/MyClass.php`. In order for this alias to be able to be resolved into a file path, +either `@foo` or `@foo/bar` must be a [root alias](concept-aliases.md#defining-aliases). + +When you are using the [Basic Application Template](start-basic.md), you may put your classes under the top-level +namespace `app` so that they can be autoloaded by Yii without the need of defining a new alias. This is because +`@app` is a [predefined alias](concept-aliases.md#predefined-aliases), and a class name like `app\components\MyClass` +can be resolved into the class file `AppBasePath/components/MyClass.php`, according to the algorithm we just described. + +In the [Advanced Application Template](tutorial-advanced-app.md), each tier has its own root alias. For example, +the front-end tier has a root alias `@frontend` while the back-end tier `@backend`. As a result, you may +put the front-end classes under the namespace `frontend` while the back-end classes under `backend`. This will +allow these classes to be autoloaded by the Yii autoloader. + + +类映射表(Class Map) +--------- + +The Yii class autoloader supports the *class map* feature which maps class names to the corresponding class file paths. +When the autoloader is loading a class, it will first check if the class is found in the map. If so, the corresponding +file path will be included directly without further check. This makes class autoloading super fast. In fact, +all core Yii classes are being autoloaded this way. + +You may add a class to the class map `Yii::$classMap` as follows, + +```php +Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php'; +``` + +[Aliases](concept-aliases.md) can be used to specify class file paths. You should set the class map in the +[bootstrapping](runtime-bootstrapping.md) process so that the map is ready before your classes are used. + + +用其他自动加载器 +----------------------- + +Because Yii embraces Composer as a package dependency manager, it is recommended that you also install +the Composer autoloader. If you are using some 3rd-party libraries that have their autoloaders, you should +also install them. + +When you are using the Yii autoloader together with other autoloaders, you should include the `Yii.php` file +*after* all other autoloaders are installed. This will make the Yii autoloader to be the first one responding to +any class autoloading request. For example, the following code is extracted from +the [entry script](structure-entry-scripts.md) of the [Basic Application Template](start-basic.md). The first +line installs the Composer autoloader, while the second line installs the Yii autoloader. + +```php +require(__DIR__ . '/../vendor/autoload.php'); +require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); +``` + +You may use the Composer autoloader alone without the Yii autoloader. However, by doing so, the performance +of your class autoloading may be degraded, and you must follow the rules set by Composer in order for your classes +to be autoloadable. + +> Info: If you do not want to use the Yii autoloader, you must create your own version of the `Yii.php` file + and include it in your [entry script](structure-entry-scripts.md). + + +自动加载扩展类 +----------------------------- + +The Yii autoloader is capable of autoloading [extension](structure-extensions.md) classes. The sole requirement +is that an extension specifies the `autoload` section correctly in its `composer.json` file. Please refer to the +[Composer documentation](https://getcomposer.org/doc/04-schema.md#autoload) for more details about specifying `autoload`. + +In case you do not use the Yii autoloader, the Composer autoloader can still autoload extension classes for you.