ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Yii2 应用对象(Application)完全指南:配置、属性、事件与生命周期

Yii2 应用对象(Application)完全指南:配置、属性、事件与生命周期 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载导读在 Yii2 中应用Application是掌管整个应用系统结构与生命周期的核心对象每个 Yii 应用系统都拥有唯一一个应用对象它由入口脚本创建并全局暴露为\Yii::$app。本文以官方指南的《Приложения应用》一章为骨架结合当前仓库的 framework/base/Application.php 等源码实现系统讲解应用配置的加载方式、全部核心属性的含义与默认值、四类应用事件以及从请求进入到响应返回的完整生命周期。读完本文你将能够独立编写一份完整、正确的 Yii2 应用配置文件并能利用事件钩子在合适的时机介入请求处理流程。说明语境中应用一词可能指应用对象Application 实例也可能指整个应用系统。本文默认指前者。Yii2 共有两种应用类型yii\web\ApplicationWeb 应用处理 HTTP 请求与yii\console\Application控制台应用处理命令行命令。二者均继承自抽象基类yii\base\Application后者又继承自yii\base\Module因此应用本身也是一个模块拥有模块的全部能力控制器映射、子模块、事件等。应用配置Application Configurations入口脚本在创建应用时会加载一份配置并将其应用到应用对象上。以典型的 Web 入口脚本web/index.php为例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还可能配合params.php、db.php等拆分文件。从源码看yii\base\Application的构造函数framework/base/Application.php会依次执行将自身注册为Yii::$app全局单例调用preInit()预处理高优先级属性如basePath调用registerErrorHandler()注册错误处理器交给Component::__construct()完成剩余属性的批量配置。构造函数的注解明确要求配置中必须同时包含id与basePath否则会抛出InvalidConfigException。控制台应用还有一个特殊能力支持通过命令行--appconfigpath选项指定配置文件路径见 framework/console/Application.php若未指定则使用构造函数传入的配置。应用属性Application Properties应用属性描述了应用运行的环境例如控制器如何加载、临时文件存放在哪里等。官方文档将它们划分为三组必填属性、重要属性因应用而异通常需要配置与有用属性默认值符合惯例仅在需要打破惯例时配置。必填属性idid是应用的唯一标识主要用于程序内部区分不同应用例如多模块、多应用场景。虽然并非硬性要求但为了最佳互操作性官方建议只使用字母数字字符。从源码看preInit()framework/base/Application.php在$config[id]缺失时会直接抛出InvalidConfigException(The id configuration for the Application is required.)——这是硬性必填项。basePathbasePath指定应用的根目录它包含应用系统全部受保护的源代码通常在其下可以看到models、views、controllers等对应 MVC 模式的子目录。配置值可以是目录路径或路径别名两种形式下目录都必须真实存在否则抛异常路径会经realpath()规范化设置该属性会同时把路径别名app预定义为该目录setBasePath()因此可以用app/runtime、app/views等派生路径引用其下的子目录。同样地basePath缺失时preInit()也会抛出InvalidConfigException。重要属性aliases允许在配置数组中批量定义别名数组键为别名名以开头值为对应路径[ aliases [ name1 path/to/path1, name2 path/to/path2, ], ]该属性存在的意义是你可以在应用配置中定义别名而无需逐个调用Yii::setAlias()。bootstrap这是非常实用的属性用于指定一组应在应用引导bootstrapping过程中被加载的组件。例如若希望某个模块在启动时定制 URL 规则可以将其 ID 写入该属性。每个元素支持以下五种格式components中定义的应用组件 IDmodules中定义的模块 ID类名配置数组匿名函数创建并返回组件。示例[ bootstrap [ // 应用组件 ID 或模块 ID demo, // 类名 app\components\Profiler, // 配置数组 [ class app\components\Profiler, level 3, ], // 匿名函数 function () { return new app\components\Profiler(); } ], ]Info如果某模块 ID 与应用组件 ID 相同引导过程中将使用应用组件。若想使用模块可用匿名函数显式指定[ function () { return Yii::$app-getModule(user); }, ]底层实现bootstrap()方法framework/base/Application.php会依次实例化每个元素闭包直接调用并取其返回值字符串先尝试作为组件 ID$this-has()或模块 ID$this-hasModule()解析若都不命中且不含\则抛InvalidConfigException(Unknown bootstrapping component ID: ...)其余情况通过Yii::createObject()创建。若组件类实现了yii\base\BootstrapInterface还会调用其bootstrap()方法。一个典型实战案例来自基础项目模板Basic Project Template的config/web.php——开发环境下将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; }Notebootstrap中放入过多组件会降低应用性能因为每个请求都会加载同一批组件。请审慎使用引导组件。catchAll仅 Web 应用该属性仅受yii\web\Application支持framework/web/Application.php。它指定一个处理所有用户请求的控制器动作主要用于维护模式maintenance mode下让所有请求统一走单个动作。配置是一个数组第一个元素是动作路由其余键值对是传递给动作的参数[ catchAll [ offline/notice, param1 value1, param2 value2, ], ]底层实现在handleRequest()framework/web/Application.php中若catchAll非空则不再通过$request-resolve()解析路由而是直接用$route $this-catchAll[0]并剥离其余参数作为动作参数。Info启用该属性后开发环境下的 Debug 面板将无法工作。components这是最重要的属性用于注册一组命名组件即应用组件[ components [ cache [ class yii\caching\FileCache, ], user [ identityClass app\models\User, enableAutoLogin true, ], ], ]每个应用组件以键值对形式给出键是组件 ID值是该组件的类名或配置注册后可通过\Yii::$app-componentID全局访问更详细内容参见应用组件一节。源码佐证preInit()会把核心组件coreComponents()返回的log、view、formatter、i18n、urlManager、assetManager、security以及可选存在的mailer见 framework/base/Application.php合并进components配置若自定义配置未指定class则自动补上默认类保证内置组件开箱即用。controllerMap该属性允许把控制器 ID 映射到任意控制器类。默认情况下 Yii 依据controllerNamespace的约定进行映射如 IDpost映射到app\controllers\PostController。通过该属性可以打破约定。例如下面配置中account映射到app\controllers\UserControllerarticle映射到app\controllers\PostController[ controllerMap [ account app\controllers\UserController, article [ class app\controllers\PostController, enableCsrfValidation false, ], ], ]键是控制器 ID值是控制器类的全限定类名或配置。controllerMap属性本身定义在基类yii\base\Module中framework/base/Module.php。controllerNamespace该属性指定控制器类默认所在的命名空间默认值为app\controllers。若控制器 ID 为post按约定控制器类名不含命名空间为PostController全限定类名即为app\controllers\PostController对应属性默认值见 framework/base/Application.php。控制器类也可位于该命名空间对应目录的子目录中例如 IDadmin/post对应全限定类名app\controllers\admin\PostController必须保证控制器类的全限定类名可被自动加载且其实际命名空间与该属性一致否则访问应用时会得到 Страница не найдена页面未找到错误如需打破约定请配置 controllerMap。language该属性指定应用向最终用户展示内容的语言默认值为en英语。如需支持多语言必须配置此项。它决定了国际化的多个方面消息翻译、日期格式化、数字格式化等。例如yii\jui\DatePicker部件默认用它决定日历显示语言与日期格式。官方建议使用 [IETF 语言标签] 规范书写如en表示英语、en-US表示美国英语。注意源码中的默认值实际为en-US见 framework/base/Application.php即文档所说默认en与实际代码存在细微差异配置时建议显式指定。更多细节见国际化章节。modules该属性指定应用包含的模块。值为模块类或配置的数组键为模块 ID[ modules [ // 以模块类指定 booking 模块 booking app\modules\booking\BookingModule, // 以配置数组指定 comment 模块 comment [ class app\modules\comment\CommentModule, db db, ], ], ]更多细节见模块章节。name应用的显示名称可展示给最终用户。与必须唯一的id不同name主要用于展示无需唯一。若代码未使用该属性则无需配置。源码默认值为My Applicationframework/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 语言标签] 规范书写。更多细节见国际化章节。timeZone该属性是设置 PHP 运行时默认时区的另一种方式。配置该属性本质上等价于调用 PHP 函数date_default_timezone_set()。例如[ // 欧洲/莫斯科译者注 timeZone America/Los_Angeles, ]源码佐证setTimeZone()framework/base/Application.php内部就是一行date_default_timezone_set($value)。同时preInit()在php.ini未配置date.timezone时会回退设置为UTC见 framework/base/Application.php。version应用的版本号默认值为1.0。若代码未使用它则无需配置。有用属性charset应用使用的字符编码默认UTF-8。对绝大多数应用应保持默认除非在处理包含大量非 Unicode 数据的遗留系统时。defaultRoute指定当请求未指定路由时应用使用的默认路由。路由可包含子模块 ID、控制器 ID 与/或动作 ID例如help、post/create、admin/post/create。若未给出动作 ID则使用yii\base\Controller::defaultAction指定的默认值。Web 应用默认值为siteframework/web/Application.php即使用SiteController及其默认动作。因此不带路由访问应用时展示的是app\controllers\SiteController::actionIndex()的结果控制台应用默认值为helpframework/console/Application.php即内置命令yii\console\controllers\HelpController::actionIndex()。因此不带任何参数执行yii时会显示帮助信息。extensions该属性指定应用安装并使用的扩展列表。默认情况下其值为vendor/yiisoft/extensions.php返回的数组该文件由 Composer 在安装扩展时自动生成与维护因此绝大多数情况无需配置。特殊场景下手动维护扩展时可这样配置[ extensions [ [ name extension name, version version number, bootstrap BootstrapClassName, // 可选也可以是配置数组 alias [ // 可选 alias1 to/path1, alias2 to/path2, ], ], // ... 其余扩展同理 ... ], ]属性值为扩展规范数组每个扩展至少包含name与version。若扩展需要在引导过程中运行可指定bootstrap元素引导类名或配置数组扩展还可定义若干别名。源码佐证bootstrap()方法在$this-extensions null时会自动加载vendor/yiisoft/extensions.php随后先为每个扩展注册alias再实例化bootstrap元素并判断是否实现BootstrapInterface见 framework/base/Application.php。layout指定渲染视图时使用的默认布局名默认值为main即使用布局目录见下文 layoutPath下的main.php。若布局目录与视图目录均为默认值则默认布局文件可表示为别名app/views/layouts/main.php。如需默认禁用布局可设为false非常少见。layoutPath指定查找布局文件的路径默认值为视图目录见下文 viewPath下的layouts子目录。视图目录取默认值时默认布局路径为app/views/layouts。可配置为目录或路径别名。runtimePath指定存放临时文件如日志文件、缓存文件的路径默认值为别名app/runtime对应的目录。可配置为目录或路径别名该目录必须对运行应用的进程可写目录应防止最终用户访问因为其中临时文件可能含敏感信息Yii 为此预定义了别名runtime。源码佐证setRuntimePath()在设置路径的同时会注册runtime别名framework/base/Application.phpgetRuntimePath()未设置时默认取basePath/runtimeframework/base/Application.php。viewPath指定视图文件的根目录默认值为别名app/views对应的目录。可配置为目录或路径别名。vendorPath指定由 Composer 管理的第三方库目录包含应用使用的全部第三方库含 Yii 框架本身默认值为别名app/vendor对应的目录。可配置为目录或路径别名修改该属性时务必同步调整 Composer 配置Yii 为此预定义了别名vendor。源码佐证setVendorPath()在设置路径时会同时注册vendor、bower与npm三个别名framework/base/Application.phpgetVendorPath()未设置时默认取basePath/vendor。enableCoreCommands仅控制台应用该属性仅受yii\console\Application支持指定是否启用 Yii 内置的核心控制台命令默认值为trueframework/console/Application.php。源码佐证init()中若enableCoreCommands为真会把coreCommands()返回的内置命令注册进controllerMap若未被覆盖随后无论如何都会确保help命令存在framework/console/Application.php。应用事件Application Events应用在处理请求的生命周期中会触发多个事件可在应用配置中以on eventName语法挂载处理器[ on beforeRequest function ($event) { // ... }, ]on eventName语法详见配置一章。也可以在应用对象创建后的引导过程中动态挂载例如\Yii::$app-on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { // ... });四个事件常量定义在 framework/base/Application.php 与 framework/base/Module.php 中。EVENT_BEFORE_REQUEST事件名beforeRequest在应用开始处理请求之前触发。触发时应用对象已被配置并初始化因此非常适合通过事件机制插入自定义代码来拦截请求处理流程。例如处理器可根据某些参数动态设置language属性。EVENT_AFTER_REQUEST事件名afterRequest在应用完成请求处理之后、发送响应之前触发。此时请求处理已结束可借此机会对请求做后处理或定制响应。注意response组件在向用户发送内容时也会触发自己的事件这些事件发生在该事件之后。EVENT_BEFORE_ACTION事件名beforeAction在每个控制器动作执行之前触发。事件参数是yii\base\ActionEvent实例处理器可将$event-isValid设为false以阻止动作执行。例如[ on beforeAction function ($event) { if (некоторое условие) { $event-isValid false; } else { } }, ]同名beforeAction事件也会在模块和控制器上触发触发顺序为应用最先 → 模块若有→ 控制器最后。一旦某个处理器将isValid设为false后续所有事件都不会再触发。EVENT_AFTER_ACTION事件名afterAction在每个控制器动作执行之后触发。事件参数同样是yii\base\ActionEvent通过$event-result可访问或修改动作的执行结果。例如[ on afterAction function ($event) { if (некоторое условие) { // 处理 $event-result } else { } }, ]同名afterAction也会在模块与控制器上触发但其顺序与beforeAction相反控制器最先 → 模块若有→ 应用最后。应用生命周期Application Lifecycle当入口脚本被执行为处理某个请求时应用将经历如下生命周期入口脚本将应用配置作为数组加载入口脚本创建新的应用对象调用preInit()配置高优先级属性如basePath还会处理vendorPath、runtimePath、timeZone、container并把核心组件合并进components注册错误处理器errorHandler组件见registerErrorHandler()framework/base/Application.php配置应用其余属性调用init()后者进一步调用bootstrap()运行引导组件含扩展的引导项与bootstrap属性中的组件入口脚本调用run()运行应用framework/base/Application.php触发EVENT_BEFORE_REQUEST事件处理请求把请求信息解析为路由及关联参数按路由创建模块、控制器与动作对象执行动作触发EVENT_AFTER_REQUEST事件将响应发送给最终用户入口脚本从应用获取退出状态码结束请求处理。run()的源码完整印证了这一过程它通过$this-state依次经历STATE_BEFORE_REQUEST→STATE_HANDLING_REQUEST→STATE_AFTER_REQUEST→STATE_SENDING_RESPONSE→STATE_END五种状态并在对应节点触发事件、调用抽象方法handleRequest()与$response-send()各状态常量见 framework/base/Application.php。此外Web 应用在bootstrap()阶段还会额外注册webroot入口脚本所在目录与web基础 URL两个别名framework/web/Application.php这也是 Web 与控制台应用引导差异的体现。小结与延伸阅读应用对象是 Yii2 应用系统的总开关配置决定了它如何加载控制器、存储临时文件、解析路由与国际化事件提供了在请求前、请求后、动作前、动作后四个关键节点介入的机会生命周期则完整串联了从入口脚本创建对象到响应发送的每一步。更深入了解配置语法概念配置应用组件注册与访问应用组件路径别名机制概念别名引导组件执行细节运行时引导模块组织方式模块入口脚本职责入口脚本源码参考framework/base/Application.php、framework/web/Application.php、framework/console/Application.php、framework/base/Module.php赞分享后端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框架3种实例化渲染方案对比OpenGL-Examples性能优化指南3种实例化渲染方案对比OpenGL Examples性能优化指南 OpenGL Examples是一个专注于提供简单单文件OpenGL示例的项目通过实例化渲后端Web框架Emscripten Module 对象完全指南从属性配置到运行时生命周期控制Emscripten Module 对象完全指南从属性配置到运行时生命周期控制 Module 是 Emscripten 生成的 JavaScript 中一个全编译器WebAssembly开发工具构建工具上一篇Spinning Up模型保存终极指南checkpoint管理完整教程下一篇Tacotron未来发展方向从论文引用到技术演进的终极路线图分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表