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
英文地址,請注明出處:http://en.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;。…