php是A-OK用於模板
PHP 模板引擎常常因其易於產生劣質代碼而受到批評,但這並非必然。讓我們看看PHP 項目如何在不依賴專用模板引擎的情況下強制執行基本的模型-視圖-控制器(MVC) 結構。
首先,簡要回顧一下PHP 的歷史
PHP 作為HTML 模板工具的歷史充滿了曲折。
最早用於HTML 模板的編程語言之一是C,但很快發現它使用起來很繁瑣,並且通常不適合這項任務。
Rasmus Lerdorf 正是考慮到這一點才創建了PHP。他不反對使用C 來處理後端業務邏輯,但想要一種更好的方法來生成前端的動態HTML。 PHP 最初被設計為一種模板語言,但隨著時間的推移,它採用了更多功能,最終成為了一種獨立的完整編程語言。
PHP 在編程模式和HTML 模式之間切換的獨特能力被認為非常方便,但也使得程序員很容易編寫難以維護的代碼——將業務邏輯和模板邏輯混合在一起的代碼。一個PHP 文件可能以一些HTML 模板開始,然後突然毫無預警地深入到一個高級SQL 查詢中。這種結構難以閱讀,並且難以重用HTML 模板。
隨著時間的推移,Web 開發社區發現,為PHP 項目強制執行嚴格的MVC 結構越來越有價值。模板引擎被創建出來,作為一種有效地將視圖與其控制器分離的方法。
為了完成這項任務,模板引擎通常具有以下特性:
- 引擎故意削弱了業務邏輯的能力。例如,如果開發人員想要執行數據庫查詢,他們需要在控制器中進行該查詢,然後將結果傳遞給模板。在模板的HTML 中間進行查詢是不可能的。
- 引擎在幕後處理常見的安全風險。即使開發人員未能驗證用戶輸入並將其直接傳遞到模板中,模板通常也會自動轉義任何危險的HTML。
模板引擎現在已成為許多Web 技術棧中的主要功能。它們可以創建更易於維護、更安全的代碼庫,因此這毫不奇怪。
但是,也可以使用純PHP 來處理HTML 模板。您可能出於多種原因想要這樣做。也許您正在處理一個遺留項目,並且不想引入任何額外的依賴項,或者您正在處理一個非常小的項目,並且更喜歡保持輕量級。或者,這個決定根本不取決於您。
PHP 模板的用例
我經常實現純PHP 模板的一個地方是WordPress,它默認情況下不強制執行嚴格的MVC 結構。我覺得引入一個完整的模板引擎有點過於繁瑣,但我仍然希望將我的業務邏輯與我的模板分開,並希望我的視圖可重用。
無論您的原因是什麼,使用純PHP 來定義您的HTML 模板有時是首選。這篇文章探討瞭如何以一種比較專業的方式來做到這一點。這種方法代表了PHP 模板臭名昭著的意大利麵條式代碼風格和正式模板引擎提供的“不允許邏輯”方法之間的實用折衷方案。
讓我們深入了解如何將基本的模板系統付諸實踐的示例。同樣,我們使用WordPress 作為示例,但這可以替換為純PHP 環境或許多其他環境。您不需要熟悉WordPress 即可繼續閱讀。
目標是將我們的視圖分解成組件,並在業務邏輯和HTML 模板之間創建明顯的區分。具體來說,我們將創建一個顯示卡片網格的視圖。每張卡片都將顯示最近文章的標題、摘要和作者。
步驟1:獲取要呈現的數據
第一步是獲取我們想要在視圖中顯示的數據。這可能涉及執行SQL 查詢或使用框架/CMS 的ORM 或輔助函數間接訪問數據庫。它還可以涉及向外部API 發出HTTP 請求或從表單或查詢字符串收集用戶輸入。
在這個例子中,我們將使用WordPress 的get_posts
輔助函數來獲取一些要在我們的主頁上顯示的文章。
<?php // index.php $wp_posts = get_posts([ 'numberposts' => 3 ]);
我們現在可以訪問我們想要在卡片網格中顯示的數據,但在將其傳遞給我們的視圖之前,我們需要做一些額外的工作。
步驟2:準備模板數據
get_posts
函數返回一個WP_Post 對像數組。每個對像都包含我們需要的文章標題、摘要和作者信息,但我們不想將我們的視圖與WP_Post 對像類型耦合,因為我們可能想要在項目的其他地方在我們的卡片上顯示其他類型的數據。
相反,主動將每個文章對象轉換為中性數據類型(如關聯數組)是有意義的:
<?php // index.php $wp_posts = get_posts([ 'numberposts' => 3 ]); $cards = array_map(function ($wp_post) { return [ 'heading' => $wp_post->post_title, 'body' => $wp_post->post_excerpt, 'footing' => get_author_name($wp_post->post_author) ]; }, $wp_posts);
在這種情況下,每個WP_Post 對像都使用array_map
函數轉換為關聯數組。請注意,每個值的鍵不是title、excerpt 和author,而是賦予了更通用的名稱:heading、body 和footing。我們這樣做是因為卡片網格組件旨在支持任何類型的數據,而不僅僅是文章。例如,它可以很容易地用於顯示包含引用和客戶名稱的推薦網格。
數據準備妥當後,現在可以將其傳遞到我們的render_view
函數中:
<?php // index.php // 數據獲取和格式化與之前相同render_view('cards_grid', [ 'cards' => $cards ]);
當然, render_view
函數還不存在。讓我們定義它。
步驟3:創建渲染函數
// 定義在functions.php 或其他使其全局可用的位置。 // 如果你擔心全局命名空間中可能發生衝突, // 你可以將此函數定義為命名空間類的靜態方法function render_view($view, $data) { extract($data); require('views/' . $view . '.php'); }
此函數接受要呈現的視圖的名稱和一個表示任何要顯示數據的關聯數組。 extract
函數獲取關聯數組中的每個項目並為其創建一個變量。在這個例子中,我們現在有一個名為$cards
的變量,其中包含我們在index.php 中準備的項目。
由於視圖在其自身函數中執行,因此它擁有自己的作用域。這很好,因為它允許我們使用簡單的變量名而無需擔心衝突。
我們函數的第二行打印與傳遞的名稱匹配的視圖。在這種情況下,它在views/cards_grid.php
中查找視圖。讓我們繼續創建該文件。
步驟4:創建模板
<?php /* views/cards_grid.php */ ?>
此模板使用剛剛提取的$cards
變量並將其呈現為無序列表。對於數組中的每個卡片,模板都會呈現一個子視圖:單個卡片視圖。
擁有單個卡片的模板很有用,因為它使我們可以靈活地直接呈現單個卡片或在項目的其他地方的另一個視圖中使用它。
讓我們定義基本的卡片視圖:
<?php /* views/card.php */ ?> <div> <?php if (!empty($heading)) : ?> <h4><?php echo htmlspecialchars($heading) ?></h4> <?php endif; ?> <?php if (!empty($body)) : ?> <p><?php echo htmlspecialchars($body) ?></p> <?php endif; ?> <?php if (!empty($footing)) : ?> <?php echo htmlspecialchars($footing) ?> <?php endif; ?> </div>
由於傳遞到渲染函數的$card
包含heading、body 和footing 的鍵,因此現在可以在模板中使用相同名稱的變量。
在這個例子中,我們可以相當肯定我們的數據沒有XSS 危險,但有可能這個視圖以後可能會與用戶輸入一起使用,因此將每個值傳遞給htmlspecialchars
是謹慎的做法。如果我們的數據中存在腳本標籤,它將被安全地轉義。
檢查每個變量在呈現之前是否包含非空值通常也很有幫助。這允許省略變量而不會在我們的標記中留下空的HTML 標籤。
PHP 模板引擎很棒,但有時使用PHP 來完成其最初的設計目的也是合適的:生成動態HTML 。
PHP 中的模板化不必導致難以維護的意大利麵條式代碼。只要稍加預見,我們就可以實現一個基本的MVC 系統,使視圖和控制器彼此分離,而且這可以用令人驚訝的少量代碼來完成。
以上是php是A-OK用於模板的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tartanify.com上,我們收集了5,000多個格子呢
