Swoft2 框架精华教程:Swoft 的视图组件

概述

用模板对页面进行渲染,这是比较经典的一种设计方式了。主要目的是在服务器端进行页面渲染,以使客户端浏览器可以直接拿到页面 html 的代码,这样对搜索引擎对网站的收录比较友好。如果是前后端分离的形式,由于前后端交互是用 js 进行,搜索引擎无法对页面渲染后进行 js 代码的执行,导致无法获取最终的 html 页面结构。所以这种方式对网站的 seo 很不友好,对主要依赖自然搜索流量的站点来说,不要采取前后端分离方式。

Swoft 的这个 View 组件,就是针对服务器端渲染的一个组件。可以自定义网页公共模板,布局文件。对页面拆分提供帮助。

详细说明

@View 注解

  • template:用来标注访问路由和view 模板的绑定关系

    标注了绑定关系,在 Controller/action 执行结束后,才会找此控制器对应的模板,如果 RequestMapping 绑定的 class/method 和 View 组件绑定的模板路径是同一个,则会自动解析此模板。

  • layout:指定的模板路径,如果不设置,则会使用 view 组件的默认模板

控制器配置模板
    /*** @RequestMapping(route="[/|index.html]", method={"GET"})* @View("home/index")** @param Request $request* @param Response $response* @return Response*/

配置了 @view 注解后,无需在 Controller 的方法中在手动进行 render,方法执行完后,会自动进行页面渲染。

这个机制是通过自定义的 Middleware 实现的。具体可以参见 vendor/swoft/view/src/Middleware 中的 ViewMiddleware.php 查看源代码。只要在项目中引入了这个中间件,在处理客户端请求时候,就会实现 view 的自动加载。

配置 ViewMiddleware

配置 ViewMiddleware 主要有以下几种方式:

全局配置

可以在 bean.php 定义文件中,配置 httpServer 的 httpDispatcher 全局 Middleware。

所谓全局配置,也就是说,请求没有异常,所有的请求都会执行完所有的全局配置中间件。

以下这种配置方式,可以看到,会在用户自定义 UserMiddleware::class 执行后执行 ViewMiddleware,具体,可以参见之前的教程:Middlewares 优先级,里面有关于中间件配置优先级的详细说明,所有的规则都是来自于对源代码的了解。

    'httpDispatcher'     => ['middlewares'      => [\Swoft\Http\Session\SessionMiddleware::class,\Swoft\Http\Server\Middleware\ValidatorMiddleware::class,],'afterMiddlewares' => [\Swoft\View\Middleware\ViewMiddleware::class,]],
通过 @Middleware 注解进行配置 ViewMiddleware 中间件

首先我们知道 @Middleware 注解的可配置对象为:“CLASS”, “METHOD”, “ANNOTATION”,如下源码:

/*** Class Middleware** @since 2.0** @Annotation* @Target({"CLASS", "METHOD", "ANNOTATION"})* @Attributes({*     @Attribute("name", type="string"),* })*/
final class Middleware
配置类注解

也就是说,这个注解可以配置针对一个类的所有方法,比如配置到 TestController 类注解上,表示 TestController 中的任何一个方法执行时候,都会在 UserMiddleware::class 级别自动将指定的中间件动态添加(详见 Middlewares 优先级说明)。这样,只有访问到这个控制器的请求才会执行到对应的中间件。

配置方法注解

如题,将 @Middleware 注解配置到方法上,只有请求指定控制器的绑定了 @Middleware 注解的方法,才会执行对应的中间件逻辑。

配置注解的注解
/*** Class AuthRoleController** @since 2.0* @Controller("auth/role")* @Middlewares({*     @Middleware(ViewMiddleware::class),*     @Middleware(AuthMiddleware::class)* })*/

@Middleware 注解可以配置到 @Middlewares 注解之中。@Middlewares 注解,如其名字,就是可以绑定多个中间件,执行顺序按照绑定的顺序从上往下执行。

模板代码使用

当指定的方法或者类已经绑定了 ViewMiddleware::class 中间件,一旦控制器中的逻辑执行完毕,后续就会自动执行当前方法绑定的模板页面。

以下示例中这个方法就是访问网站首页时候,会在 resource/views(默认模板存放路径)下寻找 home/index.php,如果有这个文件,就会执行渲染。

/*** @RequestMapping(route="[/|index.html]", method={"GET"})* @View("home/index")** @param Request $request* @param Response $response* @return Response*/
代码渲染类 Renderder::class
// 此段代码摘自 ViewMiddleware 中间件 process 方法中
$actionId = $route->getHandler();
if (!$info = ViewRegister::findBindView($actionId)) {return $response;
}// Get layout and template
[$template, $layout] = $info;// Accept list
$allowedAccepts = $request->getHeader('accept');
$currentAccept  = current($allowedAccepts);
$contentType    = ContentType::HTML;if ($template && false !== strpos($currentAccept, $contentType)) {$data = $response->getData();if (is_object($data) && $data instanceof Arrayable) {$data = $data->toArray();}/* @var Renderer $view */$renderer = bean('view'); // 此处为获取模板渲染的对象$content  = $renderer->render($template, $data, $layout);return $response->withContent($content)->withContentType($contentType);
}

由以上代码可见,最终调用了 Renderer::class->render渲染的模板。模板中使用的为控制器传递过来的 data 参数数组。

// 在控制器执行完毕时候,将要渲染的变量传递给模板,这里的 data 就是渲染到模板中的参数集合。
$data = ['test' => 'this is a test.'
];
return $response->withData($data);

在模板中使用 $this 变量是可以的,这个指向了 Renderer 对象实例。使用参数时候可以直接调用 $data['test'] 中的参数。也可以直接使用 $data变量中的一级键名作为变量名(也就是直接用 $test)。因为在模板渲染时候,render 方法中使用了以下代码:

protected function protectedIncludeScope($file, array $data): void
{extract($data, EXTR_OVERWRITE);include $file; // 特别注意:千万不要在 data 中放入 file 键,会将此处模板名给覆盖掉。
}

剩下的就是在模板中进行 php html 混编了,这个都是基础,不在赘述。

PHP Swoft2 开源框架系列教程专栏推荐

Swoft2 框架精华教程:Validator 校验器详解

Swoft 框架精华教程:Devtool 详解

Swoft2 框架精华教程:Controller 组件解析,使用说明

Swoft2 框架精华教程:Config 配置解析,使用说明

Swoft2 框架精华教程:CLog 使用篇

Swoft2 框架精华教程:数据库 Migration

Swoft2 框架精华教程:数据库操作

Swoft2 框架精华教程: Swoft 组件开发单元测试

Swoft2 框架精华教程:面向切面编程(Aspect)

Swoft2 框架精华教程:Annotation 注解机制详解

Swoft 框架精华教程:Bean 定义的实例化

Swoft2 框架精华教程:Swoft 的视图组件

Swoft2 框架精华教程:Swoft 的启动过程与核心源代码解析

Swoft2 框架精华教程:Middlewares 优先级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910247.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[学习] 哈希码:原理、用途与实现详解(C代码示例)

哈希码:原理、用途与实现详解 博主在《在C语言中使用字典》一文中,使用哈希来实现键值对的快速检索,今天对哈希这一算法工具,进行一些深入的研究,争取能能做到知其然亦知其所以然。 文章目录 哈希码:原理、…

golang--channel的关键特性和行为

Go 语言 Channel 的核心特性与行为深度解析 Channel 是 Go 语言并发编程的核心组件,用于在不同 goroutine 之间进行通信和同步。以下是其关键特性和行为的全面分析: 一、基本特性 1. 类型安全通信管道 ch : make(chan int) // 只能传递整数2. 方向性…

HarmonyOS 5 鸿蒙多模态融合测试技术方案详解

以下是针对HarmonyOS 5多模态融合测试的技术方案详解,综合交互逻辑、容错机制及分布式验证等核心模块: ‌一、多模态交互核心逻辑验证‌ ‌事件融合机制‌ 通过kit.AbilityKit监听语音指令,结合ArkUI手势系统捕获屏幕坐标: import…

在AI普及的大环境下神经网络在新能源汽车热管理系统中的应用简介

一、神经网络的核心原理与结构 1. 生物启发与基础组成 神经网络(Artificial Neural Network, ANN)受生物神经元信息处理机制启发,由大量人工神经元互联构成计算模型。每个神经元接收输入信号(如温度、流量等物理量)&a…

​ CATIA V5与3DEXPERIENCE协同设计:引领无人机行业新纪元

在无人机行业蓬勃发展的今天,传统设计流程正面临前所未有的系统性挑战。更令人担忧的是,随着无人机应用场景的不断拓展,从农业植保到城市物流,从应急救援到军事侦察,对产品性能的要求日益严苛。传统设计方法已难以应对…

关于科技公司经营的一些想法

分析了一些我们公司的问题: 1,测试 重视测试,加大测试投入 2,人才 人才评判标准:结果论,主要根据该岗位问题的解决效率与质量评判。工作时长不重要 任人唯贤。尽可能录用能解决问题的人才,不…

校招生成长日记(一):初来乍到

提前来了几天,感受一下广东的生活。第一印象就是闷热!后面尝了潮汕火锅,椰子鸡,荔枝,都很不错!!!就是没有重口味的,好想念我的酸辣粉,麻辣烫啊......y走了瞬间…

【精选】移动端学习平台设计与开发 移动端平台开发(含资料阅读、时事新闻、时政答题与讨论功能) 基于移动端的专题教育平台设计与实现

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Protobuf 高级特性详解 —— 嵌套消息、Oneof 字段与自定义选项

在前几篇文章中,我们已经掌握了 Protocol Buffers(Protobuf)的基础语法、.proto 文件的结构、以及如何使用 Go 和 Java 进行数据的序列化与反序列化操作。本篇文章将深入探讨 Protobuf 的高级特性,包括: 嵌套消息&…

golang--数据类型与存储

在 Go 语言中,理解值类型(value types)和引用类型(reference types)的区别对于编写高效、正确的代码至关重要。以下是主要的区别点和需要注意的特殊情况: 一、值类型(Value Types) …

uniapp——轮播图、产品列表轮播、上一页、下一页、一屏三张图

案例展示 组件封装 <template><view><view class="showSwiperBox"><view class="topSwiper"><swiper class="swiper" :autoplay="autoplay" interval="5000" :previous-margin="margin&qu…

用Python实现安全封装EXE文件加密保护工具

一、概述 这个Python脚本实现了一个强大的EXE文件加密保护工具,它能够将任何Windows可执行文件封装到一个带密码保护的GUI程序中。核心功能包括: 使用AES-256加密算法保护原始EXE文件 创建美观的密码验证界面 支持自定义程序图标 自动处理PyInstaller打包过程 修复Tkinter在…

vue3监听属性watch和watchEffect的详解

文章目录 1. 前言2. 常规用法3. 监听对象和route变化4. 使用场景4.1 即时表单验证4.2 搜索联想功能4.3 数据变化联动处理 5. watchEffect详解5-1 基本概念5-2 核心用法基础示例&#xff1a;自动响应依赖变化处理异步副作用停止监听与清理副作用 5-3 高级场景应用监听多个响应式…

Spring IoC核心实现揭秘

Spring IoC(控制反转)的实现机制是Spring框架的核心,其本质是将对象的创建、依赖管理和生命周期控制权从应用程序代码转移到容器中。以下是其核心实现机制: 🔧 一、核心实现步骤 配置元数据加载 容器启动时读取XML/注解/Java配置类,解析为BeanDefinition对象(包含类名、…

Solidity内部合约创建全解析:解锁Web3开发新姿势

合约创建基础 new 关键字创建合约 在 Solidity 中&#xff0c;new关键字是创建合约实例的最基本方式&#xff0c;它就像是一个 “魔法钥匙”&#xff0c;能够在以太坊区块链上生成一个全新的合约实例。使用new关键字创建合约的过程非常直观&#xff0c;就像我们在其他编程语言…

OCR大模型,破解金融文档处理困境,从文字识别到文字理解

金融机构在日常运营中处理海量文档。这些文档类型多样&#xff0c;格式复杂&#xff0c;是业务运营的基础。如何高效、准确地处理这些文档&#xff0c;直接影响机构的运营效率与风险控制水平。新一代的OCR大模型技术为此提供了有效的解决方案。它提升了文档处理的自动化程度与数…

2025.6.21笔记(2)

1.编写一个程序&#xff0c;输入一个整数&#xff0c;判断它是奇数还是偶数 解题思路&#xff1a; 1.因为要判断输入的数是奇数还是偶数&#xff0c;所以要用到if判断 2.判读奇偶数&#xff1a;如果这个数%20&#xff0c;则它为偶数&#xff0c;如果这个数%2!0&#xff0c;则…

【Ambari3.0.0 部署】Step7—Mariadb初始化-适用于el8

如果有其他系统部署需求可以参考原文 https://doc.janettr.com/install/manual/ MariaDB 10 是 Ambari 及大数据平台的常见数据库方案。本文适配 Rocky Linux 8.10&#xff0c;涵盖 MariaDB 10.11 推荐安装、YUM 源配置、参数优化、初始化和安全设置&#xff0c;帮助你一步到位…

SpringBoot电脑商城项目--删除收获地址+热销排行

删除收获地址 1 删除收获地址-持久层 1.1 规划sql语句 在删除操作之前判断该数据是否存在&#xff0c;判断该条地址的归属是否是当前的用户执行删除收货地址的操作 delete from t_address where aid? 如果用户删除的时默认地址&#xff0c;将剩下地址的某一条作为默认收货地…

MIMIC-III 数据集文件简介

文件简介&#xff1a; 共26个文件 admissions.csv 患者入院信息&#xff08;入院时间、出院时间、入院类型、科室等&#xff09;。 callout.csv ICU 外科室请求 ICU 会诊的呼叫记录。 caregivers.csv 护理患者的医护人员信息&#xff08;身份、角色等&#xff09;。…