ARTICLE DETAIL

资讯详情

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

Yii2 应用架构总览:MVC 模式与入口脚本、应用、组件、模块、过滤器、小部件六大核心实体

Yii2 应用架构总览:MVC 模式与入口脚本、应用、组件、模块、过滤器、小部件六大核心实体 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本指南以 Yii2 官方指南「Обзор структуры приложения」应用结构总览为核心系统讲解 Yii2 应用的整体组织方式MVC 架构下模型、视图、控制器的职责划分以及 MVC 之外支撑一个完整应用运转的六大实体——入口脚本、应用、应用组件、模块、过滤器和小部件。读完本文你将理解一个 Yii2 请求从入口脚本到响应返回的完整链路并能根据项目规模正确选用模块、组件、过滤器与小部件来组织自己的应用。Yii2 应用静态结构示意图入口脚本входной скрипт1:1 引导应用приложение应用下挂载控制器、模块、应用组件与过滤器视图与模型、小部件、资源包相互关联图片源自 docs/guide-ru/images/application-structure.png。MVCYii2 应用的骨架Yii2 应用按照经典的模型-视图-控制器Model-View-ControllerMVC架构模式组织。三者各司其职共同完成「接收请求 → 处理业务 → 输出响应」的完整循环模型Models代表数据、业务逻辑和业务规则。模型把「业务数据」抽象为可访问的属性Attribute并承载数据验证、字段标签、批量赋值等能力。Yii2 中模型通常继承yii\base\Model更进阶的数据场景则使用继承自它的yii\db\ActiveRecordActive Record 模式。控制器与视图都围绕模型展开模型是三者中「数据与规则」的唯一权威来源。视图Views负责向最终用户呈现信息。Web 应用中的视图通常是「以 HTML 为主、夹带展示性 PHP 代码」的视图模板文件view template由yii\web\View这一 应用组件 统一管理渲染与组装。控制器Controllers接收用户的输入将其转换为模型与视图能够理解的格式和命令并负责渲染正确的视图返回给用户。控制器由若干个动作Action组成动作是最终用户能够寻址并请求执行的最小单位。三者职责边界可以概括为一句模型管数据、视图管展示、控制器管调度。控制器本身不写业务规则而是把请求数据交给模型处理再把模型结果注入视图输出。MVC 之外的六大核心实体仅有 MVC 三要素还不足以支撑一个真实可运行的应用。Yii2 应用还包含以下六大实体它们与 MVC 协作构成应用的完整骨架实体作用一句话概括对应文档入口脚本直接暴露给最终用户的 PHP 脚本负责启动并处理进入的请求structure-entry-scripts.md应用Application全局可访问的对象统筹管理各应用组件、协调它们完成请求处理structure-applications.md应用组件注册在应用中的对象为处理请求提供各种服务路由、数据库、缓存等structure-application-components.md模块Module自包含的软件包内部自带完整的 MVC应用可由多个模块组织而成structure-modules.md过滤器Filter在控制器处理请求之前与之后执行的代码structure-filters.md小部件Widget可嵌入视图的对象包含可复用的逻辑与 UI供不同视图反复使用structure-widgets.md下面逐一深入。入口脚本请求处理的第一站入口脚本Entry Script是应用引导流程的第一步。无论是 Web 应用还是控制台应用都只有一个入口脚本最终用户的请求总是先到达入口脚本由它实例化应用对象并把请求转交给应用处理。Web 应用的入口脚本必须放在 Web 服务器可访问的目录下例如站点根目录通常命名为index.php也可以叫其他名字只要 Web 服务器能找到它即可。控制台应用的入口脚本通常存放在应用根目录basePath下命名为yii带.php后缀并被设置为可执行这样用户就能通过./yii route [arguments] [options]命令运行控制台应用——仓库根目录下的 framework/yii 正是这样一个控制台入口脚本。入口脚本按顺序完成以下几件事定义全局常量如YII_DEBUG、YII_ENV注册 Composer 自动加载器引入 Yii 类文件加载应用配置创建并配置应用实例调用yii\base\Application::run()处理进入的请求。以 Basic 项目模板为例Web 入口脚本web/index.php的完整形态如下?php defined(YII_DEBUG) or define(YII_DEBUG, true); defined(YII_ENV) or define(YII_ENV, dev); // 注册 Composer 自动加载器 require __DIR__ . /../vendor/autoload.php; // 引入 Yii 类文件 require __DIR__ . /../vendor/yiisoft/yii2/Yii.php; // 加载应用配置 $config require __DIR__ . /../config/web.php; // 创建、配置并运行应用 (new yii\web\Application($config))-run();控制台入口脚本对应 framework/yii 的形态则略有不同——它显式捕获退出码并以exit()返回给操作系统#!/usr/bin/env php ?php defined(YII_DEBUG) or define(YII_DEBUG, true); defined(YII_ENV) or define(YII_ENV, dev); // 注册 Composer 自动加载器 require __DIR__ . /vendor/autoload.php; // 引入 Yii 类文件 require __DIR__ . /vendor/yiisoft/yii2/Yii.php; // 加载应用配置 $config require __DIR__ . /config/console.php; $application new yii\console\Application($config); $exitCode $application-run(); exit($exitCode);应用Application全局协调者应用Application是掌控 Yii 应用系统整体结构与生命周期的对象。每个 Yii 应用系统只包含一个应用对象它由入口脚本创建并可通过全局表达式\Yii::$app在任何地方访问。Yii2 提供两种应用类型yii\web\Application处理 Web 请求yii\console\Application处理控制台命令请求。说明语境不同时「应用application」可能指应用对象也可能指整个应用系统application system。应用对象创建时会加载一份配置并应用到自己身上典型的应用配置通常保存在web.php这类配置文件中。配置中最少要设置两个必需属性id唯一标识应用的 ID主要用于程序内部建议只使用字母数字字符以保证最佳互操作性。basePath应用根目录即存放全部受保护源码的目录其下通常有models、views、controllers等对应 MVC 的源码子目录。它既可以是目录路径也可以是路径别名但对应目录必须真实存在否则会抛出异常路径会经realpath()规范化。basePath常被用来推导其他重要路径如运行时目录因此 Yii 预定义了指向它的别名app派生态路径可写成app/runtime。应用对象执行请求的核心逻辑可以在源码 framework/base/Application.php 的run()方法中看到它清晰地呈现了应用的状态机public function run() { try { $this-state self::STATE_BEFORE_REQUEST; $this-trigger(self::EVENT_BEFORE_REQUEST); $this-state self::STATE_HANDLING_REQUEST; $response $this-handleRequest($this-getRequest()); $this-state self::STATE_AFTER_REQUEST; $this-trigger(self::EVENT_AFTER_REQUEST); $this-state self::STATE_SENDING_RESPONSE; $response-send(); $this-state self::STATE_END; return $response-exitStatus; } catch (ExitException $e) { $this-end($e-statusCode, isset($response) ? $response : null); return $e-statusCode; } }从源码可以看到一次请求处理依次经历STATE_BEFORE_REQUEST → STATE_HANDLING_REQUEST → STATE_AFTER_REQUEST → STATE_SENDING_RESPONSE → STATE_END五个状态先触发EVENT_BEFORE_REQUEST事件然后调用handleRequest()该方法在 Web 与控制台应用中各有实现处理请求随后触发EVENT_AFTER_REQUEST事件最后发送响应并返回退出状态码。应用组件按需加载的服务提供者应用本身是一个服务定位器Service Locator它承载着一组所谓的应用组件Application Components。例如urlManager组件负责把 Web 请求路由到合适的控制器db组件提供数据库相关服务cache组件提供缓存能力。每个应用组件都有唯一 ID你可以通过\Yii::$app-componentID访问它例如\Yii::$app-db获取数据库连接、\Yii::$app-cache获取注册的主缓存。组件在第一次被访问时才实例化之后的访问都返回同一个实例单例语义。组件可以是任意对象通过在应用配置的components属性中注册[ components [ // 用类名注册 cache 组件 cache yii\caching\ApcCache, // 用配置数组注册 db 组件 db [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnamedemo, username root, password , ], // 用匿名函数注册 search 组件 search function () { return new app\components\SolrService; }, ], ]提示应用组件可以注册任意多个但应谨慎为之——组件本质上是「全局变量」过多使用会让代码更难测试和维护。多数场景下创建局部组件、按需使用即可。有时你希望某个组件在每一次请求中都实例化即使它从未被显式访问这时把它列在应用的bootstrap属性中即可。bootstrap中的元素可以是应用组件 ID、模块 ID、类名、配置数组或返回组件的匿名函数。闭包不要求返回已实例化组件——它也可以单纯用于在应用实例化后执行一段代码[ bootstrap [ log, // 保证 log 组件总是被加载 function ($app) { return new ComponentX(); }, function ($app) { // 一些初始化代码 return; } ], components [ log [ // log 组件的配置 ], ], ]模块自带完整 MVC 的迷你应用模块Module是由模型、视图、控制器及其他支撑组件组成的自包含软件单元。安装到应用后最终用户就能访问模块内的控制器因此模块常被视为「迷你应用」。模块与应用的差别在于模块不能独立部署必须寄居在应用之内模块还可以嵌套模块结构图中以0..*双向关联体现。一个模块就是一个目录称为模块的basePath目录内结构与应用类似包含controllers、models、views等子目录。典型的模块目录布局如下forum/ Module.php 模块类文件 controllers/ 存放控制器类文件 DefaultController.php 默认控制器类文件 models/ 存放模型类文件 views/ 存放控制器视图与布局文件 layouts/ 存放布局视图文件 default/ 存放 DefaultController 的视图文件 index.php index 视图文件每个模块必须有一个继承yii\base\Module的模块类位于模块 basePath 之下并保证可自动加载namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this-params[foo] bar; // ... 其他初始化代码 ... } }如果init()中需要初始化大量属性可以把它们保存为配置并在init()中加载public function init() { parent::init(); // 用 config.php 中加载的配置初始化模块 \Yii::configure($this, require __DIR__ . /config.php); }配置文件内容与应用配置类似可以声明components与params。需要说明的是结构图中模块与应用之间的0..*关联意味着一个应用可以包含多个模块、模块也可以层层嵌套这为大型项目提供了清晰的横向与纵向拆分手段。过滤器请求处理前后的钩子过滤器Filter是在控制器动作执行之前和/或之后运行的对象。例如访问控制过滤器在动作执行前校验当前用户是否有权限内容压缩过滤器在动作执行后、响应发送前压缩响应内容。一个过滤器可以包含前置过滤逻辑pre-filter和后置过滤逻辑post-filter。过滤器本质上是行为Behavior的特例因此用法与行为一致——在控制器中重写behaviors()方法即可声明public function behaviors() { return [ [ class yii\filters\HttpCache, only [index, view], lastModified function ($action, $params) { $q new \yii\db\Query(); return $q-from(user)-max(updated_at); }, ], ]; }默认情况下控制器中声明的过滤器作用于该控制器的所有动作通过配置yii\base\ActionFilter的only/except属性可以精确指定过滤哪些动作。除了控制器过滤器还可以声明在模块或应用中——此时它作用于该模块/应用下所有控制器的所有动作。注意在模块或应用中声明过滤器时only/except属性应使用路由而非动作 ID因为动作 ID 无法在模块/应用范围内唯一定位动作。当多个过滤器作用于同一动作时按以下规则执行前置过滤按应用 → 模块 → 控制器的顺序各自按其behaviors()中列出的顺序执行若某个过滤器取消了动作执行其后含前置与后置的过滤器都不会再执行。动作执行通过前置过滤后执行动作本体。后置过滤按控制器 → 模块 → 应用的逆序执行各自列出的过滤器。自定义过滤器时继承yii\base\ActionFilter并重写beforeAction()和/或afterAction()前者在动作前执行其返回值决定动作是否执行返回false会跳过后续过滤器并中止动作后者在动作后执行。小部件可复用的视图积木小部件Widget是可嵌入视图的可复用构建块以面向对象方式生成复杂、可配置的用户界面元素。比如一个日期选择器小部件能生成精美的日期输入控件你只需在视图中插入一行代码?php use yii\jui\DatePicker; ? ? DatePicker::widget([name date]) ?Yii2 自带大量开箱即用的小部件如yii\widgets\ActiveForm活动表单、yii\widgets\Menu菜单以及 jQuery UI、Twitter Bootstrap 系列小部件。使用小部件主要调用yii\base\Widget::widget()方法它接收一份配置数组初始化小部件并返回渲染结果——例如下面这段代码配置日期选择器使用俄语界面、并把输入保存在$model的from_date属性中?php use yii\jui\DatePicker; ? ? DatePicker::widget([ model $model, attribute from_date, language ru, dateFormat php:Y-m-d, ]) ?部分小部件支持内容块模式用yii\base\Widget::begin()与yii\base\Widget::end()包裹一段内容。例如ActiveForm会在begin()/end()调用的位置分别生成form开始与结束标签中间的内容原样渲染?php use yii\widgets\ActiveForm; use yii\helpers\Html; ? ?php $form ActiveForm::begin(); ? ? $form-field($model, username) ? ? $form-field($model, password)-passwordInput() ? ? Html::submitButton(Login) ? ?php ActiveForm::end(); ?结构图中视图与小部件之间的0..*关联正体现了「视图可任意嵌套小部件」的组合能力小部件与资源包Asset Bundle管理 CSS/JS 静态资源的关联则保证了每个小部件所需的样式与脚本能被正确发布与加载。一张图读懂应用静态结构回到本文开头以及俄语版总览文档中的结构示意图它可以总结为四条主线引导线入口脚本1:1→ 应用。应用是唯一的全局容器调度线应用1..→ 控制器控制器0..→ 过滤器请求前/后钩子与应用组件服务提供者展示线控制器0..→ 视图视图0..→ 小部件与模型模型0..*→ 视图扩展线应用0..*→ 模块可嵌套模块内部再次复用完整的 MVC 与上述所有机制。小结与延伸阅读Yii2 应用 MVC 三要素 六大支撑实体。入口脚本负责引导应用负责全局协调与生命周期管理应用组件按需提供数据库、缓存、路由等服务模块负责横向/纵向拆分业务过滤器在动作前后织入横切逻辑小部件沉淀可复用的界面单元。理解这套结构是掌握 Yii2 的起点也是阅读后续所有指南的前提。继续深入阅读推荐按以下顺序展开模型structure-models.md含 Active Recorddb-active-record.md视图structure-views.md控制器structure-controllers.md入口脚本structure-entry-scripts.md应用structure-applications.md应用组件structure-application-components.md模块structure-modules.md过滤器structure-filters.md小部件structure-widgets.md请求生命周期图解runtime-overview.md 与 runtime-requests.md需要对照源码验证实现细节时可重点查阅 framework/base/Application.php应用生命周期与run()状态机、framework/base/Module.php、framework/base/ActionFilter.php 与 framework/base/Widget.php。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Appium 驱动与插件管理详解Extension CLI 与 npm 两种策略及源码实现解析Appium 驱动与插件管理详解Extension CLI 与 npm 两种策略及源码实现解析 要在 Appium 上完成任何实际的自动化工作至少需要安装一后端Web框架Yii2 应用结构总览MVC 架构与七大核心实体深入解析Yii2 应用结构总览MVC 架构与七大核心实体深入解析 本文是 Yii2 框架应用结构的总览指南系统梳理 Yii 应用如何按照「模型 视图 控制器MVC后端Web框架Yii 2 应用结构全景解析从 MVC 骨架到入口脚本、应用组件、模块与过滤器Yii 2 应用结构全景解析从 MVC 骨架到入口脚本、应用组件、模块与过滤器 本文以 Yii 2 官方指南的应用结构总览章节为骨架系统梳理 Yii 2后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表