ARTICLE DETAIL

资讯详情

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

Yii 2 入门实战:创建第一个“Hello World“动作(Action)与视图(View)

Yii 2 入门实战:创建第一个“Hello World“动作(Action)与视图(View) 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇技术指南围绕 Yii 2 框架的 MVC 入门流程展开带领你在应用中创建第一个Hello页面从编写控制器内的say动作、创建对应视图到通过 URL 路由触发并理解 Yii 的请求分发机制。读完本文你将掌握动作Action、视图View、路由Route三个核心概念的完整实战用法并能在自己的 Yii 2 项目中独立复现这一最小可运行示例。从请求到响应一次完整的 MVC 最小闭环在 Yii 2 中一个 Web 请求要到达用户浏览器需要经过一条清晰的链路。本文要创建的Hello页面正好能演示这条链路的两个核心环节Web 应用接收请求并将请求分发dispatch给对应的动作Action动作依次渲染对应的视图View把Hello字样呈现给最终用户。通过本篇教程你将学到三件事如何创建动作来响应请求如何创建视图来组装响应内容应用如何把请求分发到动作上。这套流程与 Yii 2 的 MVC 架构一一对应控制器Controller负责接收与分发视图View负责输出模型Model在本示例中暂不参与——因为这里唯一用到的数据只是message参数。关于 MVC 各组成部分的完整讲解可参考结构总览。创建动作Creating an Action在 SiteController 中声明say动作动作Action是终端用户可以直接引用并触发的对象动作按控制器分组动作的执行结果就是用户最终收到的响应。本任务需要创建一个名为say的动作它从请求中读取message参数并展示给用户如果请求中没有该参数则显示默认文本SalomHello。动作必须声明在控制器中。为了简单起见我们把say动作直接加在已有的SiteController里该控制器定义在controllers/SiteController.php文件中?php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { // ...已有代码... public function actionSay($message Salom) { return $this-render(say, [message $message]); } }上面的代码中say动作被定义为SiteController类中的一个名为actionSay的方法。Yii 使用action前缀来区分控制器类中的动作方法与非动作方法action前缀之后的部分就映射为动作的 ID。Info动作Action是终端用户可以直接引用执行的对象动作按控制器Controller分组动作的执行结果即终端用户收到的响应。动作的完整定义、参数绑定与命名规则详见控制器详解。动作 ID 与动作方法名的映射规则命名动作时需要理解 Yii 对待动作 ID 的规则动作 ID 始终使用小写字母如果动作 ID 由多个单词组成单词之间用连字符-连接例如create-comment动作 ID 映射到方法名时去掉 ID 中的连字符 → 每个单词首字母大写 → 加上action前缀。例如动作 IDcreate-comment对应方法名actionCreateComment。这一转换逻辑在源码中有精确实现framework/base/Controller.php#L262-L268 使用正则/^(?:[a-z0-9_]-)*[a-z0-9_]$/校验 ID 合法性然后通过action . str_replace( , , ucwords(str_replace(-, , $id)))生成方法名最后用反射确认方法是 public 且名字完全一致才包装成InlineAction返回。动作参数如何从请求中自动填充示例中的动作方法接收参数$message其默认值为Salom——这和你在 PHP 中给任何函数或方法参数设置默认值的方式完全一致。当应用收到请求并判定由say动作处理时会按参数名从请求中取出同名参数填充进去。换句话说如果请求里带有messageGoodbye那么动作内的$message变量就会被赋值为Goodbye。从源码看这一参数绑定机制由 framework/web/Controller.php#L133-L194 的bindActionParams()完成它通过ReflectionMethod反射出动作方法的形参列表逐一在请求参数中按名字查找找到就做类型校验后填入找不到但形参有默认值则使用默认值两者都没有则抛出BadRequestHttpExceptionMissing required parameters。测试用例 tests/framework/web/ControllerTest.php#L58-L71 专门验证了同名参数被正确绑定、缺失参数回退到默认值的行为。用 render() 渲染视图在动作方法内部调用了 [[yii\web\Controller::render()|render()]] 来渲染名为say的视图文件并把message参数传给视图使用。渲染结果由动作方法return返回应用收到后会把结果作为完整 HTML 页面的一部分展示给浏览器中的用户。render()的源码位于 framework/base/Controller.php#L422-L426其工作分两步public function render($view, $params []) { $content $this-getView()-render($view, $params, $this); return $this-renderContent($content); }先通过View组件渲染视图得到内容片段再调用renderContent()把内容嵌入布局Layout中。布局的查找规则也定义在同一个类中默认在views/layouts/main.php查找布局文件。想跳过布局只渲染视图片段可以使用renderPartial()见 framework/base/Controller.php#L453-L456。创建视图Creating a View编写say视图文件视图View是你编写的、用来生成响应内容的脚本。本任务需要创建一个say视图它负责打印从动作方法接收到的message参数?php use yii\helpers\Html; ? ? Html::encode($message) ?say视图应保存在views/site/say.php文件中。当动作中调用 [[yii\web\Controller::render()|render()]] 时框架会按views/ControllerID/ViewName.php的路径规则查找对应的 PHP 文件——即views/目录下以控制器 ID 命名的子目录再加视图名与.php后缀。为什么必须对输出做 HTML 编码注意上面代码中message在输出前经过了 [[yii\helpers\Html::encode()|HTML 编码]]。这一步是必须的因为该参数来自终端用户输入如果不做过滤攻击者可以在参数中嵌入恶意 JavaScript 代码发动跨站脚本XSS攻击。Html::encode()的实现见 framework/helpers/BaseHtml.php#L117-L120本质是调用 PHP 内置的htmlspecialchars()按应用配置的字符集默认UTF-8把、、、、等特殊字符转义为 HTML 实体从而让用户输入只被当作纯文本渲染不会作为脚本执行。视图与渲染机制的进一步讲解可参考视图详解。视图本质上是 PHP 脚本当然你可以在say视图中放入更多内容包括 HTML 标签、纯文本甚至 PHP 语句。事实上say视图就是一个由 [[yii\web\Controller::render()|render()]] 执行的普通 PHP 脚本脚本打印出的内容会被作为响应结果返回给应用再由应用输出给终端用户。视图文件定位的底层实现在 framework/base/View.php#L154-L158 的View::render()先按视图名解析出文件路径再交给renderFile()执行。动手验证Trying It Out访问新页面创建好动作和视图之后通过下面的 URL 即可访问新页面https://hostname/index.php?rsite%2FsaymessageSalomdunyo页面会显示Salom dunyoHello World文本并且与站内其他页面共用相同的头部Header和底部Footer。如果在 URL 中省略message参数页面则只显示Salom。这是因为message是传给actionSay()方法的参数省略时其默认值Salom会被自动使用——这正是bindActionParams()中缺失参数回退到默认值分支的直观体现。Info新页面与其他页面共用相同的头部和底部是因为 [[yii\web\Controller::render()|render()]] 方法会自动把say视图的渲染结果嵌入到所谓的布局Layout中本例的布局文件位于views/layouts/main.php。布局相关的机制详见视图详解中的布局小节。认识路由参数r上面的 URL 中参数r需要进一步解释。它代表路由Route是应用中指向某个动作的全局限一标识格式为ControllerID/ActionID。当应用收到请求时会按下面的流程处理对应源码调用链framework/web/Application.php#L81-L86 的handleRequest()调用$request-resolve()解析路由framework/web/Request.php#L316-L326 的resolve()转交UrlManager::parseRequest()解析出route与paramsr参数即在此阶段被读取路由中的ControllerID部分决定实例化哪个控制器类控制器再用ActionID部分决定实例化哪个动作framework/base/Controller.php#L251-L273 的createAction()最终由 framework/base/Controller.php#L150-L199 的runAction()执行动作内部再经由InlineAction::runWithParams()framework/base/InlineAction.php#L53-L62完成参数绑定并调用方法。在本例中路由site/say会被解析为SiteController控制器类中的say动作最终调用SiteController::actionSay()方法处理请求。路由的完整机制参见路由与分发详解。控制器的 ID 命名规则和动作一样控制器在应用中也拥有唯一标识自己的 ID。控制器 ID 的命名规则与动作 ID 相同控制器类名由控制器 ID 派生而来——去掉 ID 中的连字符、每个单词首字母大写、末尾追加Controller后缀。例如控制器 IDpost-comment对应控制器类名PostCommentController。Info这些 ID 规则贯穿整个 Yii 2 框架无论控制器还是动作ID 始终小写、多词用连字符连接类名/方法名则按去连字符 单词首字母大写 前后缀的规则生成从而保证 URL 路由与 PHP 类、方法之间可以双向无损映射。小结Summary在本节中你接触到了 MVC 架构模式中的控制器和视图两个部分在控制器中创建了一个动作来处理特定请求创建了一个视图来组装响应内容这个简单示例中没有涉及模型Model因为唯一使用的数据只是message参数。同时你也认识了 Yii 的路由Route体系——它是连接用户请求与控制器动作之间的桥梁是框架分发机制中至关重要的一环。在下一节中你将学习如何创建模型Model并添加一个包含 HTML 表单的新页面进一步体会 MVC 三要素的完整协作。延伸阅读控制器Controller与动作Action详解动作声明、ID 命名、参数绑定与请求生命周期视图View详解视图文件、布局Layout与渲染机制路由与 URL 生成r参数的解析过程与美化 URL 配置入门指南第一个应用本地环境搭建与骨架应用初始化源码参考framework/base/Controller.php、framework/web/Controller.php、framework/base/View.php、framework/helpers/BaseHtml.php测试参考tests/framework/web/ControllerTest.php 中的testBindActionParams()验证了动作参数绑定的行为赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 入门实战从零创建第一个 Hello World 页面Action、View 与路由全解析Yii 2 入门实战从零创建第一个 Hello World 页面Action、View 与路由全解析 本篇指南带你以最经典的 Hello World后端Web框架Yii 2 实战入门构建你的第一个 Hello World 页面Action、View 与路由全解析Yii 2 实战入门构建你的第一个 Hello World 页面Action、View 与路由全解析 本篇技术指南以 Yii 2 官方西班牙语入门教程后端Web框架Yii 2 入门实战用 Action 与 View 从零创建 Hello 页面Yii 2 入门实战用 Action 与 View 从零创建 Hello 页面 本篇指南以 Yii 2 官方入门教程《Katakan Hello》为主线后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表