ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Yii 2 应用(Application)完全指南:配置、属性、事件与请求生命周期解析

Yii 2 应用(Application)完全指南:配置、属性、事件与请求生命周期解析 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本指南以 Yii 2 官方指南印尼语版《Aplikasi》docs/guide-id/structure-applications.md为骨架结合本仓库framework/目录下的真实源码framework/base/Application.php、framework/web/Application.php、framework/console/Application.php进行深度验证与扩充。读完本文你将能够正确编写入口脚本并组织应用配置掌握id、basePath、bootstrap、components、catchAll等全部核心属性的含义与默认值理解四个内置应用事件的使用时机并完整掌握一次 Web 请求从进入到返回所经历的整个应用生命周期。在 Yii 2 中应用Application是掌控 Yii 应用系统整体结构与生命周期的核心对象。每个 Yii 应用系统都只包含一个应用对象它在入口脚本中被创建并可通过全局表达式\Yii::$app在任何地方访问。提示根据上下文语境当我们说一个应用时可能指应用对象也可能指应用系统需结合语境理解。Yii 2 共有两种类型的应用[[yii\web\Application]]Web 应用主要用于处理 Web 请求[[yii\console\Application]]控制台应用主要用于处理命令行请求。在源码层面两者都继承自抽象基类yii\base\Application见 framework/base/Application.php分别由 framework/web/Application.php 和 framework/console/Application.php 实现并各自定义了不同的核心组件与默认路由Web 应用默认site控制台应用默认help。应用配置Application Configurations当入口脚本创建应用对象时会加载一份配置数组并将其应用到应用对象上典型写法如下require __DIR__ . /../vendor/autoload.php; require __DIR__ . /../vendor/yiisoft/yii2/Yii.php; // 加载应用配置 $config require __DIR__ . /../config/web.php; // 创建应用对象并应用配置 (new yii\web\Application($config))-run();与普通配置一样应用配置规定了如何初始化应用对象的属性。由于应用配置通常非常复杂一般将其保存在配置文件中例如上面示例中的web.php。从源码看yii\base\Application::__construct()framework/base/Application.php在构造阶段会依次完成把自身注册为全局单例Yii::$app、初始化状态机为STATE_BEGIN、调用preInit()处理高优先级属性、注册错误处理器最后调用Component::__construct($config)按配置数组初始化其余属性。也就是说new 一个应用本身就是一次完整的配置解析过程。应用属性Application Properties应用配置中需要设置的属性非常多它们描述了应用所运行的环境。例如应用如何加载控制器、临时文件应存放在哪里等。下面按必需 → 重要 → 常用三个层级逐一说明。必需属性Required Properties任何应用中至少必须配置两个属性[[yii\base\Application::id|id]] 与 [[yii\base\Application::basePath|basePath]]。idid属性用于指定应用的唯一标识Unique ID主要用于程序化区分不同应用。虽然不是硬性要求但为了良好的互操作性强烈建议 ID 只使用字母数字字符alphanumeric characters。在源码中preInit()framework/base/Application.php会直接检查配置中是否存在id缺失时抛出InvalidConfigException提示The id configuration for the Application is required.。basePathbasePath属性指定应用的根目录root directory即存放应用系统全部受保护源码的目录。该目录通常包含models、views、controllers等对应 MVC 模式的子目录并且必须防止被外部直接访问。配置该属性时可以使用目录路径或路径别名path alias两种形式但无论哪种形式对应目录必须真实存在否则会抛出异常路径最终会通过 PHP 的realpath()函数进行规范化。由于basePath常被用来推导其他重要路径如 runtime 路径Yii 专门为它预定义了路径别名app其他路径都可以基于该别名派生例如app/runtime即可指向 runtime 目录。这一点在源码中得到印证setBasePath()framework/base/Application.php在设置根目录的同时会调用Yii::setAlias(app, ...)同理preInit()也会对缺失的basePath抛出InvalidConfigException。重要属性Important Properties本节属性因应用不同而差异较大通常需要显式配置。aliases该属性允许以数组形式定义一组别名数组键是别名名称数组值是对应的路径定义。例如[ aliases [ name1 path/to/path1, name2 path/to/path2, ], ]提供该属性的目的是可以在应用配置中统一定义别名而不必在代码中逐处调用Yii::setAlias()方法。bootstrap这是一个非常实用的属性用于指定一组必须在应用引导bootstrap过程中运行的组件。例如如果希望某个模块定制 URL 规则就可以把它的 ID 作为该属性的元素列出。bootstrap中的每个元素支持以下五种格式通过 components 指定的应用组件 ID通过 modules 指定的模块 ID类名class name配置数组configuration array创建并返回组件的匿名函数anonymous function。示例[ bootstrap [ // 应用组件 ID 或模块 ID demo, // 类名 app\components\Profiler, // 配置数组 [ class app\components\Profiler, level 3, ], // 匿名函数 function () { return new app\components\Profiler(); } ], ]提示如果某模块 ID 与应用组件 ID 相同引导过程中将优先使用应用组件。若确实想引导模块可以通过匿名函数显式返回它[ function () { return Yii::$app-getModule(user); }, ]在引导过程中每个组件都会被实例化如果组件类实现了 [[yii\base\BootstrapInterface]]其bootstrap()方法也会被调用。这一机制在 framework/base/Application.php 的bootstrap()实现中清晰可见先处理extensions.php中声明的扩展别名与引导项再依次实例化$this-bootstrap中声明的元素并对实现BootstrapInterface的对象调用其bootstrap($this)。另一个实际案例来自基础项目模板的应用配置在开发环境下把debug和gii模块注册为引导组件if (YII_ENV_DEV) { // 针对 dev 环境的配置调整 $config[bootstrap][] debug; $config[modules][debug] yii\debug\Module; $config[bootstrap][] gii; $config[modules][gii] yii\gii\Module; }注意在bootstrap中放入过多组件会降低应用性能因为每次请求都要运行同一批组件。请谨慎使用引导组件。catchAll该属性仅被 Web 应用支持见 framework/web/Application.php用于指定一个应处理所有用户请求的控制器动作。这通常用于维护模式maintenance mode把所有请求统一导向单个动作。配置值为数组第一个元素指定动作的 route其余元素键值对指定传递给动作的参数。例如[ catchAll [ offline/notice, param1 value1, param2 value2, ], ]在源码中yii\web\Application::handleRequest()framework/web/Application.php会先判断catchAll是否为空非空时不再解析请求而是直接使用catchAll[0]作为路由、其余键值对作为参数。提示启用该属性后开发环境下的Debug 面板将无法工作。components这是最重要的一个属性。它允许注册一组命名的、被称为应用组件的组件供应用其他位置使用。例如[ components [ cache [ class yii\caching\FileCache, ], user [ identityClass app\models\User, enableAutoLogin true, ], ], ]每个应用组件在数组中以键值对形式声明键是组件 ID值是该组件的类名或配置数组。你可以向应用注册任意组件之后即可通过\Yii::$app-componentID全局访问。从源码看preInit()framework/base/Application.php会把coreComponents()返回的核心组件与自定义配置合并——例如 Web 应用的核心组件request、response、session、user、errorHandler在 framework/web/Application.php 中定义控制台应用则在 framework/console/Application.php 中替换为yii\console\Request等。详细说明请阅读应用组件章节。controllerMap该属性允许将控制器 ID 映射到任意控制器类。默认情况下Yii 会按照命名约定把控制器 ID 映射为对应类名例如 IDpost会映射为app\controllers\PostController。通过配置该属性可以为特定控制器打破约定。下面示例中account被映射到app\controllers\UserControllerarticle被映射到app\controllers\PostController[ controllerMap [ account app\controllers\UserController, article [ class app\controllers\PostController, enableCsrfValidation false, ], ], ]该属性数组的键代表控制器 ID值代表对应的控制器类名或配置数组。controllerNamespace该属性指定控制器类所在的默认命名空间默认值为app\controllers。若控制器 ID 为post按约定其类名不含命名空间应为PostController完整类名Fully Qualified Class Name即为app\controllers\PostController。控制器类也可以存放在该命名空间对应目录的子目录中。例如对于控制器 IDadmin/post其完整控制器类为app\controllers\admin\PostController。必须确保控制器的完整类名可以被自动加载且实际命名空间与controllerNamespace的值一致。否则访问应用时会收到 Page Not Found页面未找到错误。若想打破上述约定可以配置 controllerMap 属性。该属性在 framework/base/Application.php 中声明默认值正是app\controllers。language该属性指定应用向终端用户展示内容时使用的语言。默认值为en英语。如果应用需要支持多语言就必须配置该属性。该属性的值会影响国际化的多个方面包括消息翻译、日期格式、数字格式等。例如 [[yii\jui\DatePicker]] 组件会默认依据该值决定日历以何种语言显示、日期如何格式化。建议使用 IETF 语言标签格式指定例如en表示英语en-US表示美国英语。更多细节请参考国际化章节。补充说明源码中language与sourceLanguage的默认值均为en-US见 framework/base/Application.php而文档中language的默认值 en指的是 i18n 层面的语言标签语义两者并不冲突——language决定输出语言sourceLanguage决定源码书写语言。modules该属性指定应用包含哪些模块。配置形式为模块类或配置数组组成的数组数组键为模块 ID。例如[ modules [ // 用模块类指定 booking 模块 booking app\modules\booking\BookingModule, // 用配置数组指定 comment 模块 comment [ class app\modules\comment\CommentModule, db db, ], ], ]更多细节请参阅模块章节。name该属性指定可展示给终端用户的应用名称。与要求唯一的id不同name的值主要用于展示目的不要求唯一。如果代码中没有使用它则不必配置。其默认值在源码中为My Application见 framework/base/Application.php。params该属性指定一组全局可访问的应用参数。与其在代码各处硬编码数字和字符串更推荐的做法是在配置的单一位置集中定义再在需要处引用。例如定义缩略图尺寸[ params [ thumbnail.size [128, 128], ], ]在需要用到该值的代码中$size \Yii::$app-params[thumbnail.size]; $width \Yii::$app-params[thumbnail.size][0];日后若要修改缩略图尺寸只需改动应用配置无需触碰任何依赖代码。sourceLanguage该属性指定应用代码书写所使用的语言默认值为en-US美国英语。如果代码中的文本内容不是英语就应配置该属性。与language一样建议使用 IETF 语言标签格式例如en、en-US。更多细节见国际化章节。timeZone该属性提供了设置 PHP 运行时默认时区的替代方式。配置该属性本质上等同于调用 PHP 函数date_default_timezone_set()见 framework/base/Application.php 的setTimeZone()实现。例如[ timeZone America/Los_Angeles, ]关于设置时区的影响可参考日期格式化章节英文版指南对该细节有更完整说明。值得注意的是源码中若未配置timeZone且php.ini未设置date.timezonepreInit()会默认设为UTC。version该属性指定应用的版本号默认值为1.0。若代码中未使用它则不必配置。常用属性Useful Properties本节属性通常无需配置因为其默认值来自通用约定但如果你想打破约定仍可显式配置。charset该属性指定应用使用的字符集默认值为UTF-8。除非你正在处理大量非 Unicode 数据的遗留系统否则大多数应用都应保持该默认值。defaultRoute该属性指定请求未指定 route 时应用应使用的路由。路由可以由子模块 ID、控制器 ID 和/或动作 ID 组成例如help、post/create或admin/post/create。如果未提供动作 ID该属性将取 [[yii\base\Controller::defaultAction]] 中指定的默认值。对于Web 应用默认值为site意味着使用SiteController及其默认动作。因此未指定路由访问应用时将显示app\controllers\SiteController::actionIndex()的结果见 framework/web/Application.php对于控制台应用默认值为help意味着使用核心命令 [[yii\console\controllers\HelpController::actionIndex()]]。因此不带任何参数运行yii命令时将显示帮助信息见 framework/console/Application.php。extensions该属性指定应用安装并使用的扩展列表。默认情况下会取vendor/yiisoft/extensions.php文件返回的数组该文件在使用 Composer 安装扩展时自动生成并维护因此大多数情况下无需配置该属性源码验证bootstrap()中会读取该文件并注册每个扩展的别名与引导类见 framework/base/Application.php。在需要手动维护扩展的特殊情况下可按如下方式配置[ extensions [ [ name extension name, version version number, bootstrap BootstrapClassName, // 可选也可以是配置数组 alias [ // 可选 alias1 to/path1, alias2 to/path2, ], ], // ... 更多扩展格式如上 ... ], ]可以看到该属性接受一组扩展规格数组每个扩展用包含name和version元素的数组描述若扩展需要在引导过程中运行可通过bootstrap元素指定引导类名或配置数组扩展还可以定义若干别名。layout该属性指定渲染视图时使用的默认布局名称默认值为main即使用 layoutPath 下的main.php布局文件。若 layoutPath 与 viewPath 均取默认值默认布局文件可表示为路径别名app/views/layouts/main.php。如需默认禁用布局可将其设为false但这种情况很少见。layoutPath该属性指定布局文件的查找路径默认值为 viewPath 下的layouts子目录。若 viewPath 取默认值默认布局路径即app/views/layouts。可配置为目录或路径别名。runtimePath该属性指定临时文件如日志文件、缓存文件的生成路径默认值为别名app/runtime对应的目录。可配置为目录或路径别名。注意runtime 路径必须对运行应用的进程可写该路径应防止终端用户访问因为其中的临时文件可能包含敏感信息。为简化访问Yii 已为该路径预定义别名runtime源码中setRuntimePath()会同步注册该别名见 framework/base/Application.php。viewPath该属性指定视图文件所在的根目录默认值为别名app/views对应的目录。可配置为目录或路径别名。vendorPath该属性指定由 Composer 管理的vendor 目录其中存放应用使用的全部第三方库包括 Yii 框架本身默认值为别名app/vendor对应的目录。可配置为目录或路径别名。修改该属性时请确保同步调整 Composer 配置。Yii 已为该路径预定义别名vendorsetVendorPath()还会顺带注册bower、npm别名见 framework/base/Application.php。enableCoreCommands该属性仅被控制台应用支持用于指定是否启用 Yii 发布版自带的核心命令默认值为true见 framework/console/Application.php。源码中init()会在启用时把asset、cache、fixture、help、message、migrate、serve等核心命令注册进controllerMap见 framework/console/Application.php。应用事件Application Events应用对象在处理请求的生命周期中会触发若干事件。可以在应用配置中以如下方式为这些事件挂载处理器[ on beforeRequest function ($event) { // ... }, ]on eventName语法详见配置章节。另一种方式是在引导过程中、应用实例创建后挂载处理器例如\Yii::$app-on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { // ... });四个事件的常量定义与触发位置都可在源码中找到常量见 framework/base/Application.php触发见同文件run()方法的 L376-L398。EVENT_BEFORE_REQUEST该事件在应用开始处理请求之前触发实际事件名为beforeRequest。触发时应用实例已被配置并初始化完毕因此这是通过事件机制插入自定义代码、干预请求处理过程的好时机。例如可以在事件处理器中根据某些参数动态设置language属性。EVENT_AFTER_REQUEST该事件在应用完成请求处理之后、发送响应之前触发实际事件名为afterRequest。触发时请求处理已完成可以利用该时机对请求做后处理或定制响应。注意[[yii\web\Response|response]] 组件在向用户发送响应内容时也会触发一些事件那些事件在该事件之后才触发。EVENT_BEFORE_ACTION该事件在每个控制器动作运行之前触发实际事件名为beforeAction。事件参数是 [[yii\base\ActionEvent]] 实例。处理器可将 [[yii\base\ActionEvent::isValid]] 设为false以终止动作执行。例如[ on beforeAction function ($event) { if (某种条件) { $event-isValid false; } else { } }, ]注意相同的beforeAction事件也会由模块和控制器触发。触发顺序为应用对象最先触发其次是模块若有最后是控制器。若某个事件处理器将isValid设为false后续所有事件都将不再触发。EVENT_AFTER_ACTION该事件在每个控制器动作运行之后触发实际事件名为afterAction。事件参数是 [[yii\base\ActionEvent]] 实例通过其result属性处理器可以访问或修改动作结果。例如[ on afterAction function ($event) { if (某种条件) { // 修改 $event-result } else { } }, ]注意相同的afterAction事件同样由模块和控制器触发但触发顺序与beforeAction相反控制器最先触发其次是模块若有最后才是应用。应用生命周期Application Lifecycle当入口脚本执行以处理一个请求时应用会经历以下生命周期入口脚本以数组形式加载应用配置入口脚本创建应用新实例调用preInit()配置basePath等高优先级应用属性源码见 framework/base/Application.php注册错误处理器errorHandler配置应用属性通过Component::__construct($config)完成调用init()其内部进一步调用bootstrap()运行引导组件源码见 framework/base/Application.php入口脚本调用run()运行应用源码见 framework/base/Application.php触发EVENT_BEFORE_REQUEST事件处理请求将请求解析为路由及相关参数按路由创建模块、控制器和动作对象并执行动作Web 应用的具体实现在yii\web\Application::handleRequest()见 framework/web/Application.php触发EVENT_AFTER_REQUEST事件向终端用户发送响应入口脚本从应用获取退出状态exit status0表示正常退出非零表示异常完成请求处理。从源码看run()内部还维护着一个完整的状态机STATE_BEFORE_REQUEST→STATE_HANDLING_REQUEST→STATE_AFTER_REQUEST→STATE_SENDING_RESPONSE→STATE_END状态常量定义见 framework/base/Application.php。此外end()方法framework/base/Application.php会保证在提前终止时仍正确触发EVENT_AFTER_REQUEST并发送响应替代裸exit()确保生命周期完整收尾。总结应用对象是 Yii 2 应用系统的心脏入口脚本负责加载配置并创建它id与basePath是最低限度的必需属性bootstrap、components、controllerMap、modules、params等属性共同定义了应用运行环境beforeRequest、afterRequest、beforeAction、afterAction四个事件为横切逻辑提供了标准切入点而preInit()→init()→bootstrap()→run()的调用链则勾勒出一次请求从进入到返回的完整生命周期。理解这些机制是掌握 Yii 2 应用架构、排查页面未找到类问题、以及合理组织应用代码的基础。相关概念还可进一步阅读入口脚本、应用组件、模块与运行引导等章节。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 应用Application完全指南配置、属性、事件与生命周期解析Yii 2 应用Application完全指南配置、属性、事件与生命周期解析 应用Application对象是 Yii 2 框架中统领整个应用结构M后端Web框架Yii 2 应用对象Application深入解析配置属性、请求事件与生命周期Yii 2 应用对象Application深入解析配置属性、请求事件与生命周期 本篇技术指南以官方指南 structure applications ht后端Web框架Yii 2 框架应用Application深入解析配置、属性、事件与完整生命周期Yii 2 框架应用Application深入解析配置、属性、事件与完整生命周期 本指南以 Yii 2 官方文档 structure applicatio后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表