尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Yii 2 从零创建 “Saying Hello“ 页面:Action、View 与路由分发全解析

Yii 2 从零创建 “Saying Hello“ 页面:Action、View 与路由分发全解析 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本节是 Yii 2 入门系列docs/guide-vi 越南语版中的首个实战环节在现有应用中新建一个显示 Hello 的 Web 页面。通过本指南你将亲手创建第一个 action动作与第一个 view视图并完整理解 Yii 2 如何把用户请求request分发给对应的控制器与动作、再把渲染结果作为响应返回浏览器。读完本文你将掌握① 如何定义一个响应请求的 action 方法② 如何创建视图拼接响应内容③ 应用内部 ControllerID/ActionID 路由的解析机制——这是后续编写表单、接入数据库前必须打牢的地基。目标拆解一次请求的完整旅程为了输出一行 Hello需要协作两个组件Action应用把来自页面的请求分发给 action由它负责业务处理Viewaction 调用视图渲染出面向用户的 Hello 文本。官方指南将这趟旅程概括为三步请求到达应用 → 应用将请求分发给对应的 action → action 调用 view 渲染结果。本文的示例虽然只有一行文本但它完整覆盖了 MVC 中 Controller 与 View 两个环节的协作链路没有用到 Model因为唯一的数据来源只是请求参数message是理解 MVC 架构模式 最精简的切入点。创建 Action在 SiteController 中定义 actionSay最小可运行代码Yii 中 action 必须以action为方法名前缀、声明在控制器类中。为简单起见我们复用框架脚手架自带的SiteController类文件位于controllers/SiteController.php在其中新增sayaction?php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { // ...existing code... public function actionSay($message Hello) { return $this-render(say, [message $message]); } }Action 命名规则从 ID 到方法名Yii 用action前缀区分控制器类中的 action 方法与非 action 方法前缀之后的名称即映射为该 action 的ID。命名规则是双向的Action ID 一律小写若由多个单词组成用连字符-连接例如create-comment方法名由 ID 推导去掉连字符 → 每个单词首字母大写 → 前加action。例如 IDcreate-comment对应方法actionCreateComment。这一映射关系在框架源码中可以直接印证framework/base/Controller.php 的createAction()方法使用正则/^(?:[a-z0-9_]-)*[a-z0-9_]$/校验 ID再通过action . str_replace( , , ucwords(str_replace(-, , $id)))生成方法名并用反射检查该方法是否 public 且名称完全匹配——如果找不到对应方法则返回null请求将因无法解析而抛出InvalidRouteException见同一文件的 runAction()。参数绑定请求参数如何流入方法示例中actionSay($message Hello)的$message拥有默认值——这正是 PHP 函数/方法参数的常规默认值语法。当应用判定say是处理当前请求的 action 时会按参数名从请求中取值注入若请求携带messageGoodbye则$message被赋值为Goodbye若缺省则自动采用默认值Hello。参数注入的底层实现在 framework/web/Controller.php 的bindActionParams()它通过ReflectionMethod遍历 action 方法的每个参数在请求参数中按名查找命中则可选地按参数类型做过滤转换后填入未命中且参数有默认值时取默认值否则将该参数计入$missing并最终抛出BadRequestHttpException(Missing required parameters: ...)。这意味着 action 参数列表天然就是请求参数的白名单无需手动$_GET取值。创建 View渲染 Hello 消息最小可运行代码View 是用于生成响应内容的 PHP 脚本。创建say视图用于打印 action 传来的message参数?php use yii\helpers\Html; ? ? Html::encode($message) ?将文件保存为views/site/say.php。当 action 内调用render()时Yii 会按views/ControllerID/ViewName.php的约定查找视图文件——此处即views/site/say.phpControllerID 为siteViewName 为say。视图文件查找逻辑可参考 framework/base/View.php 的findViewFile()相对视图名会以当前控制器实现ViewContextInterface的对象的 viewPath 为基准解析视图名不带扩展名时自动追加.php。为什么必须做 HTML 编码注意示例中对$message先做了 HTML 编码再输出Html::encode($message)。由于该参数来自终端用户请求直接原样输出会使其暴露于跨站脚本攻击XSS——攻击者可以把恶意 HTML 标签或 JavaScript 代码塞进message参数在页面渲染时执行。Html::encode()会把、、等特殊字符转义为安全实体从而原样显示、绝不执行。View 的本质被 render() 执行的 PHP 脚本视图里可以自由混入 HTML 标签、纯文本乃至任意 PHP 语句因为say视图本质上就是一段由render()执行的 PHP 脚本。其执行链在源码中非常清晰framework/base/Controller.php 的render()先调用$this-getView()-render($view, $params, $this)渲染视图主体内容随后renderContent()查找布局文件把视图输出嵌入布局后返回见下文布局小节framework/base/View.php 的renderFile()以include方式执行视图 PHP 文件并捕获其输出视图中的$message等变量即来自render()传入的$params数组的键值对提取。视图脚本打印出的内容会作为响应的结果返回给应用最终由应用输出给终端用户。实际运行访问 URL 看效果创建完 action 与 view 后通过以下 URL 访问新页面https://hostname/index.php?rsite%2FsaymessageHelloWorld访问该 URL 后页面显示 Hello World并与应用内其他页面共用相同的页头header与页脚footer。若省略message参数如?rsite/say则页面只显示 Hello——因为actionSay()的参数缺省时自动取默认值Hello。布局Layout从何而来新页面与其他页面共享页头页脚是因为render()会自动把say视图的渲染结果嵌入一个名为 layout 的布局中本例即views/layouts/main.php。布局查找的完整规则见 framework/base/Controller.php 的findLayoutFile()注释布局名可以是路径别名如app/views/layouts/main、以/开头的绝对路径从应用布局目录查找、或相对路径从模块布局目录查找未带扩展名时默认补.php若控制器layout属性为false则完全禁用布局。深入理解路由r 参数如何驱动分发URL 中的r参数值得重点说明。它是route路由的缩写是应用中指向某个 action 的全局限一 ID格式为ControllerID/ActionID。当应用收到请求时处理流程如下应用解析r参数取ControllerID部分本例为site确定应实例化哪个控制器类控制器再取ActionID部分本例为say确定应执行哪个 action本例中路由site/say被解析为SiteController控制器类与sayaction最终调用SiteController::actionSay()处理请求。从源码角度看这一步发生在 framework/base/Controller.phprunAction($id, $params)调用createAction($id)解析 action若解析失败action 不存在则抛出InvalidRouteException(Unable to resolve the request: ...)随后才执行beforeAction/afterAction事件钩子链并运行 action。控制器 ID 的命名规则与 action 类似控制器也有全局唯一的 ID命名规则相同控制器类名由 ID 推导——去掉连字符、每个单词首字母大写、末尾追加Controller。例如控制器 IDpost-comment对应类名PostCommentController。小结本节你已实际触碰 MVC 架构模式中的 Controller 与 View 两部分创建了控制器中的 action 来响应特定请求actionSay读取message参数并渲染视图创建了视图来拼接响应内容views/site/say.php输出经过 HTML 编码的消息本例中未涉及 Model——唯一用到的数据只是请求参数message理解了 Yii 的路由机制route 是连接用户请求与控制器 action 的桥梁格式为ControllerID/ActionID参数按名绑定到 action 方法参数。下一步你将学习如何创建 Model并新增一个包含 HTML 表单的页面——届时 MVC 三件套将完整登场。赞分享后端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 入门实战用 Action 与 View 从零创建 Hello 页面Yii 2 入门实战用 Action 与 View 从零创建 Hello 页面 本篇指南以 Yii 2 官方入门教程《Katakan Hello》为主线后端Web框架Yii 2 实战入门构建你的第一个 Hello World 页面Action、View 与路由全解析Yii 2 实战入门构建你的第一个 Hello World 页面Action、View 与路由全解析 本篇技术指南以 Yii 2 官方西班牙语入门教程后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表