ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Yii 2 路径别名(Aliases)完全指南:定义、解析与预定义别名详解

Yii 2 路径别名(Aliases)完全指南:定义、解析与预定义别名详解 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇指南系统讲解 Yii 2 框架的路径别名Aliases机制它用前缀的短名称代表文件路径或 URL帮助开发者彻底告别在代码中硬编码绝对路径与绝对 URL 的做法。阅读完本文你将掌握通过Yii::setAlias()与应用配置定义根别名和派生别名的方法、Yii::getAlias()的解析规则、yii、app、web等八个预定义别名的含义与初始化时机以及扩展别名、自动加载等源码级实现原理从而在缓存、视图、URL 生成等日常开发场景中正确、高效地使用别名。什么是别名别名Alias用于表示文件路径或 URL 地址其核心作用是让项目代码摆脱对绝对路径或绝对 URL 的依赖。为了与普通文件路径和 URL 相区分任何别名都必须以字符开头如果定义的别名没有带前缀Yii 会自动为其补上字符。// 不带 的定义也会被自动加上前缀 Yii::setAlias(foo, /path/to/foo); // 等价于 Yii::setAlias(foo, /path/to/foo);Yii 内置了大量开箱即用的预定义别名。例如yii指向 Yii 框架的安装目录web可用于获取当前 Web 应用的基础 URLbase URL。理解这些预定义别名及其初始化时机是高效使用 Yii 的前提之一。定义别名调用 Yii::setAlias() 定义根别名可以使用 [[Yii::setAlias()]] 为文件路径或 URL 定义别名// 文件路径别名 Yii::setAlias(foo, /path/to/foo); // URL 别名 Yii::setAlias(bar, https://www.example.com);注意别名所指向的文件路径或 URL并不一定真实存在。别名只是一种名称 → 路径/URL的映射记录Yii::setAlias()不会校验目标是否存在。除了目录级别名也可以为一个具体文件定义别名此时路径以文件名为结尾段// 指向包含 \foo\Bar 类的具体文件 Yii::setAlias(foo/Bar.php, /definitely/not/foo/Bar.php);根别名与派生别名基于一个已定义的别名无需再次调用Yii::setAlias()只需在其后追加/和一个或多个路径段即可派生出新别名通过Yii::setAlias()定义的别名称为根别名root alias从根别名派生得到的别名称为派生别名derived alias。例如foo是根别名而foo/bar/file.php是派生别名。还可以用一个已有别名无论是根别名还是派生别名去定义新别名Yii::setAlias(foobar, foo/bar);此时foobar会被解析为foo所指向路径下的bar目录整个过程由setAlias()内部自动完成别名到真实路径的转换。通过应用配置定义别名根别名通常在 引导加载bootstrapping 阶段定义例如可以在 入口脚本 中直接调用Yii::setAlias()。为了方便应用Application 提供了一个可写的aliases属性可以在应用 配置 中直接设置return [ // ... aliases [ foo /path/to/foo, bar https://www.example.com, ], ];这份配置通常位于config/目录下的应用配置文件中如config/web.php或config/console.php应用在构造阶段应用该配置时即完成别名注册入口脚本与业务代码随后即可直接使用这些别名。解析别名调用 [[Yii::getAlias()]] 可以把根别名转换为它所代表的文件路径或 URL该方法同样支持派生别名echo Yii::getAlias(foo); // 输出: /path/to/foo echo Yii::getAlias(bar); // 输出: https://www.example.com echo Yii::getAlias(foo/bar/file.php); // 输出: /path/to/foo/bar/file.php派生别名所表示的路径/URL 是这样确定的将派生别名中对应根别名的部分替换为根别名所代表的路径/URL。例如foo/bar/file.php中foo部分是根别名替换后得到/path/to/foo/bar/file.php。注意Yii::getAlias()不会检查解析结果对应的文件路径或 URL 是否真实存在它只做纯文本层面的映射替换。根别名中包含斜杠的情况根别名本身也可以包含/字符。此时Yii::getAlias()会智能地判断别名中的哪一部分是根别名从而正确地生成路径或 URLYii::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。从源码看这一判断逻辑位于 framework/BaseYii.php 的getAlias()中先取别名第一个/前的部分作为候选根若命中字符串类型的映射则直接拼接剩余部分若命中数组类型的映射存在多个以同一前缀开头的根别名例如同时定义foo与foo/bar则遍历映射并借助strpos($alias . /, $name . /) 0找出最长匹配的根别名进行替换。与之配套的getRootAlias()见 framework/BaseYii.php可从给定别名中反查出其对应的根别名部分当输入不是已注册的别名时getAlias($alias, false)会返回false而不是抛出InvalidArgumentException。使用别名Yii 的许多组件与 API 都能直接识别别名无需先调用Yii::getAlias()将其转换为路径或 URL。例如[[yii\caching\FileCache::cachePath]] 既接受普通文件路径也接受表示文件路径的别名——正是前缀让框架能够区分普通路径与别名use yii\caching\FileCache; $cache new FileCache([ cachePath runtime/cache, ]);上述配置将文件缓存目录指向runtime/cache即当前应用 runtime 目录下的cache子目录。类似的机制广泛存在于组件配置的路径类参数中如日志FileTarget::$logFile、视图/布局路径、vendor相关路径等。至于某个属性或方法参数是否支持别名需要查阅对应类/方法的 API 文档进行确认。别名在类自动加载中的应用别名不仅服务于路径引用还是 Yii 类自动加载器的基石。在 framework/Yii.php 中注册的Yii::autoload()实现在 framework/BaseYii.php会按照以下流程查找类文件先在classMap即 framework/classes.php中查找若类是带命名空间的如yii\base\Component则尝试加载与其命名空间对应的路径别名所指向的文件如yii/base/Component.php。由于yii预定义别名指向框架目录yii\命名空间下的所有框架类都可以通过该别名自动加载。同样地当yii/bootstrap等扩展别名存在时yii\bootstrap命名空间下的类会从对应扩展目录加载。这套机制使别名成为连接命名空间与物理文件位置的关键桥梁其细节可参考 概念自动加载。预定义别名Yii 为常用的文件路径和 URL 预定义了一组别名别名含义yiiBaseYii.php文件所在目录即框架目录app当前应用的 基础路径basePathruntime当前应用的 runtime 目录默认值为app/runtimewebroot当前 Web 应用的 Web 根目录根据 入口脚本 所在目录确定web当前 Web 应用的基础 URL与yii\web\Request::baseUrl值相同vendorComposer 的 vendor 目录默认值为app/vendorbower存放 Bower 包的根目录默认值为vendor/bowernpm存放 NPM 包的根目录默认值为vendor/npm这些别名的初始化时机不同可以从源码中得到精确印证yii在入口脚本引入Yii.php文件时定义。入口脚本通常写作require __DIR__ . /../vendor/yiisoft/yii2/Yii.php;参见 入口脚本文档随后Yii.php内部通过require __DIR__ . /BaseYii.php见 framework/Yii.php完成框架加载BaseYii.php所在目录即yii指向的框架目录。app在应用构造器执行preInit()时由 framework/base/Application.php 的setBasePath()定义Yii::setAlias(app, $this-getBasePath());。因此应用配置中的basePath会直接决定app的值。runtime同样在preInit()阶段处理。setRuntimePath()见 framework/base/Application.php先解析传入路径再执行Yii::setAlias(runtime, ...)若未显式配置getRuntimePath()默认取app/runtime。vendor、bower、npm由setVendorPath()见 framework/base/Application.php一次性注册vendor指向 vendor 目录bower与npm分别指向 vendor 下的bower与npm子目录未配置时默认 vendor 目录为app/vendor。webroot、web仅在Web 应用中定义。在 framework/web/Application.php 的bootstrap()中Yii::setAlias(webroot, dirname($request-getScriptFile())); Yii::setAlias(web, $request-getBaseUrl());前者取自入口脚本文件所在目录后者取自当前请求的基础 URL。注意正如上述源码所示web与webroot是在yii\web\ApplicationWeb 应用中定义的因此在yii\console\Application控制台应用中默认不可用。编写同时服务于 Web 与控制台的代码时例如共用配置不要假设web/webroot一定存在。扩展别名每一个通过 Composer 安装的 扩展 都会自动注册一个别名别名的名称取自扩展composer.json中声明的根命名空间别名指向该包的根目录。例如安装yiisoft/yii2-jui扩展后在引导加载阶段会自动注册Yii::setAlias(yii/jui, VendorPath/yiisoft/yii2-jui);这套机制的执行位置在 framework/base/Application.php 的bootstrap()中应用会加载vendor/yiisoft/extensions.php由 Composer 生成遍历其中每个扩展的alias配置并逐一调用Yii::setAlias()完成注册随后再执行扩展声明在bootstrap字段中的引导组件。这意味着只要 Composer 安装的扩展在其composer.json中正确声明了extra.yii.alias或自动生成的extensions.php中包含别名信息开发者就可以直接使用扩展根命名空间形式的别名引用其目录而无需手动设置。小结别名的完整生命周期将以上内容串联起来一个 Yii 2 应用中的别名生命周期大致如下入口脚本引入Yii.php→ 注册yii框架目录同时注册类自动加载器应用构造执行preInit()→ 依据配置依次注册app、runtime、vendor、bower、npm并处理应用配置中的aliases属性应用 bootstrap()→ 加载extensions.php注册各扩展别名Web 应用额外注册webroot与web业务代码中通过Yii::getAlias()或直接使用别名在缓存、日志、视图、URL 生成、类自动加载等场景中引用路径与 URL。掌握了别名机制你就能写出更可移植、更易维护的 Yii 2 代码——无论项目部署在哪个目录app、runtime、web等别名始终指向正确的目标。更深入的应用细节可继续阅读 运行时引导加载、应用结构 与 配置 相关章节。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 路径别名Aliases完全指南定义、解析、预定义别名与扩展别名机制Yii 2 路径别名Aliases完全指南定义、解析、预定义别名与扩展别名机制 路径别名Alias是 Yii 2 中用来代表文件路径或 URL 的简短后端Web框架Yii 2 路径别名Aliases完全指南 前缀机制、预定义别名与底层解析原理Yii 2 路径别名Aliases完全指南 前缀机制、预定义别名与底层解析原理 别名Aliases是 Yii 2 中用于表示文件路径或 URL 的短后端Web框架Yii 2 路径别名Alias机制完全指南定义、解析、预定义别名与扩展别名Yii 2 路径别名Alias机制完全指南定义、解析、预定义别名与扩展别名 导读 本文以 Yii 2 官方指南的别名Alias章节为核心系统讲解如何后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表