ホームページ バックエンド開発 PHPチュートリアル mvc モード PHP での MVC モードのテンプレート エンジン開発経験の共有

mvc モード PHP での MVC モードのテンプレート エンジン開発経験の共有

Jul 29, 2016 am 08:44 AM
MVCモード

Web システムの開発と保守がより便利になり、人的資源と物的資源を効果的に節約できるため、ますます多くの企業に支持されています。
テンプレート エンジンは、MVC パターン確立プロセスにおける重要な方法です。開発者は、意味を与えるタグのセットを設計し、技術的な分析と処理を通じてインターフェイス テンプレートからデータ ロジック処理を効果的に抽出し、インターフェイス テンプレートに制御権限を送信できます。対応するビジネスロジック処理プログラムは、タグの意味を解釈して必要なデータを取得し、テンプレートデザインの形式で表示できるため、設計者は表現形式にさらに集中できます。以下はテンプレートエンジンに対する私の理解と設計方法です:
良く言えばテンプレートエンジンと呼ばれていますが、実際にはテンプレートデータを解釈するプロセスです(個人的な意見です^^)。ウェブサイト構築についての私の考え方と理解により、ウェブサイトの表示形式は 2 つの形式に要約できます: 単一項目と複数項目。次に、これら 2 つの状況に対応する 2 つの対応するタグ (データ、リストなど) を設定できます。ポイントは、2 つのタグの多層ネストの問題を解決し、基本的にインターフェース形式の 80% を実現するのに適していることです。
テンプレートを解釈する方法はたくさんありますが、一般的に使用される方法には、文字列処理 (ネストの解決は少し面倒です) や正規表現が含まれます。ここで選んだ正規表現と、以下が私の処理方法です(この記事はアイデアと参考コードのみを提供するものであり、直接使用することはできません)。
テンプレートファイル解析クラス:

コードをコピー コードは次のとおりです:


/*
* クラス: 模板解析类
* 著者: 51JS.COM-ZMM
* 日付: 2011.3.1
* 電子メール: 304924248@qq.com
* ブログ: http://www .cnblogs.com/cnzmm/
*/
class テンプレート {
public $html, $vars, $bTag, $eTag;
public $bFlag='{', $eFlag='}', $pfix='zmm:';
プライベート $フォルダー、$ファイル;
function __construct($vars=array()) {
!empty($vars) && $this->vars = $vars;
!empty($GLOBALS['cfg_tag_prefix']) &&
$this->pfix = $GLOBALS['cfg_tag_prefix'].':';
$this->bTag = $this->bFlag.$this->pfix;
$this->eTag = $this->bFlag.'/'.$this->pfix;
empty(Tags::$vars) && Tags::$vars = &$this->vars;
}
パブリック関数 LoadTpl($tpl) {
$this->file = $this->GetTplPath($tpl);
Tags::$file = &$this->ファイル;
if (is_file($this->file)) {
if ($this->GetTplHtml()) {
$this->SetTplTags();
} else {
exit('模板文件追加ダウンロード失败!');
}
} else {
exit('模板文件['.$this->file.']存在しません!');
}
}
プライベート関数 GetTplPath($tpl) {
$this->folder = WEBSITE_DIRROOT.
$GLOBALS['cfg_tpl_root'];
$this->folder.'/'.$tpl; を返します。
}
プライベート関数 GetTplHtml() {
$html = self::FmtTplHtml(file_get_contents($this->file));
if (!empty($html)) {
$callFunc = Tags::$prefix.'Syntax';
$this->html = Tags::$callFunc($html, new Template());
} else {
exit('模板文ファイルの内容は空です!');
} true を返します。
}
static public function FmtTplHtml($html) {
return preg_replace('/(r)|(n)|(t)|(s{2,})/is', '', $html);
}
パブリック関数 Register($vars=array()) {
if (is_array($vars)) {
$this->vars = $vars;
Tags::$vars = &$this->vars;
}
}
パブリック関数 Display($bool=false, $name="", $time=0) {
if (!empty($this->html)) {
if ($bool && !empty( $name)) {
if (!is_int($time)) $time = 600;
$cache = 新しいキャッシュ($time);
$cache->Set($name, $this->html);
}
echo $this->html;流す();
} else {
exit('模板文ファイルの内容は空です!');
}
}
パブリック関数 SetAssign($souc, $info) {
if (!empty($this->html)) {
$this->html = str_ireplace($souc, self::FmtTplHtml($ info)、$this->html);
} else {
exit('模板文ファイルの内容は空です!');
}
}
プライベート関数 SetTplTags() {
$this->SetPanelTags(); $this->SetTrunkTags(); $this->RegHatchVars();
}
プライベート関数 SetPanelTags() {
$rule = $this->bTag.'([^'.$this->eFlag.']+)/'.$this->eFlag;
preg_match_all('/'.$rule.'/ism', $this->html, $out_matches);
$this->TransTag($out_matches, 'パネル'); unset($out_matches);
}
プライベート関数 SetTrunkTags() {
$rule = $this->bTag.'(w+)s*([^'.$this->eFlag.']*?)'.$this-> eフラグ。
'((?:(?!'.$this->bTag.')[Ss]*?|(?R))*)'.$this->eTag.'\1s*'.$this ->eフラグ;
preg_match_all('/'.$rule.'/ism', $this->html, $out_matches);
$this->TransTag($out_matches, 'トランク'); unset($out_matches);
}
プライベート関数 TransTag($result, $type) {
if (!empty($result[0])) {
switch ($type) {
case 'パネル' : {
for ($i = 0; $i < count($result[0]); $i ++) {
$strTag =explode(' ', $result[1][$i], 2);
if (strpos($strTag[0], '.')) {
$itemArg =explode('.', $result[1][$i], 2);
$callFunc = Tags::$prefix.ucfirst($itemArg[0]);
if (method_exists('Tags', $callFunc)) {
$html = Tags::$callFunc(chop($itemArg[1]));
if ($html !== false) {
$this->html = str_ireplace($result[0][$i], $html, $this->html);
}
}
} else {
$rule = '^([^s]+)s*([Ss]+)$';
preg_match_all('/'.$rule.'/is', trim($result[1][$i]), $tmp_matches);
$callFunc = Tags::$prefix.ucfirst($tmp_matches[1][0]);
if (method_exists('Tags', $callFunc)) {
$html = Tags::$callFunc($tmp_matches[2][0]);
if ($html !== false) {
$this->html = str_ireplace($result[0][$i], $html, $this->html);
}
} unset($tmp_matches);
}
} 休憩;
}
case 'トランク' : {
for ($i = 0; $i < count($result[0]); $i ++) {
$callFunc = Tags::$prefix.ucfirst($result) [1][$i]);
if (method_exists('Tags', $callFunc)) {
$html = Tags::$callFunc($result[2][$i], $result[3][$i]);
$this->html = str_ireplace($result[0][$i], $html, $this->html);
}
} 休憩;
}
デフォルト: ブレーク;
}
} else {
false を返す;
}
}
プライベート関数 RegHatchVars() {
$this->SetPanelTags();
}
function __destruct() {}
}
?>


标签解析类:(目前暂時提供データ、リスト两种标签的解析、说明思路)

复制代码代码如下:


/*
* クラス: 标签解析类
* 著者: 51JS.COM-ZMM
* 日付: 2011.3.2
* 電子メール: 304924248@qq.com
* ブログ: http://www .cnblogs.com/cnzmm/
*/
class タグ {
static private $attrs=null;
static public $file, $vars, $rule, $prefix='TAG_';
static public function TAG_Syntax($html, $that) {
$rule = $that->bTag.'ifs+([^'.$that->eFlag.']+)s*'.$that-> ;eフラグ;
$html = preg_replace('/'.$rule.'/ism', '', $html);
$rule = $that->bTag.'elseifs+([^'.$that->eFlag.']+)s*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', '', $html);
$rule = $that->bTag.'elses*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', '', $html);
$rule = $that->bTag.'loops+(S+)s+(S+)s*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', '', $html);
$rule = $that->bTag.'loops+(S+)s+(S+)s+(S+)s*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', ' \3) { ?>', $html);
$rule = $that->eTag.'(if|loop)s*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', '', $html);
$rule = $that->bTag.'phps*'.$that->eFlag.'((?:(?!'.
$that->bTag.')[Ss]*?|( ?R))*)'.$that->eTag.'phps*'.$that->eFlag;
$html = preg_replace('/'.$rule.'/ism', '', $html);
return self::TAG_Execute($html);
}
静的パブリック関数 TAG_List($attr, $html) {
if (!empty($html)) {
if (self::TAG_HaveTag($html)) {
return self::TAG_DealTag($attr, $ html、真);
} else {
return self::TAG_GetData($attr, $html, true);
}
} else {
exit('标签{リスト}の内容は空です!');
}
}
静的パブリック関数 TAG_Data($attr, $html) {
if (!empty($html)) {
if (self::TAG_HaveTag($html)) {
return self::TAG_DealTag($attr) 、$html、false);
} else {
return self::TAG_GetData($attr, $html, false);
}
} else {
exit('标签{data}の内容は空です!');
}
}
静的パブリック関数 TAG_Execute($html) {
ob_clean(); ob_start();
if (!empty(self::$vars)) {
is_array(self::$vars) &&
extract(self::$vars, EXTR_OVERWRITE);
}
$file_inc = WEBSITE_DIRINC.'/buffer/'。
md5(uniqid(rand(), true)).'.php';
if ($fp = fopen($file_inc, 'xb')) {
fwrite($fp, $html);
if (fclose($fp)) {
include($file_inc);
$html = ob_get_contents();
} unset($fp);
} else {
exit('型板解析文件生成失败!');
} ob_end_clean(); @unlink($file_inc);
$html を返す;
}
静的プライベート関数 TAG_HaveTag($html) {
$bool_has = false;
$tpl_ins = 新しいテンプレート();
self::$rule = $tpl_ins->bTag.'([^'.$tpl_ins->eFlag.']+)/'.$tpl_ins->eFlag;
$bool_has = $bool_has || preg_match('/'.self::$rule.'/ism', $html);
self::$rule = $tpl_ins->bTag.'(w+)s*([^'.$tpl_ins->eFlag.']*?)'.$tpl_ins->eFlag.
'((?:(?!'.$tpl_ins->bTag.')[Ss]*?|(?R))*)'.$tpl_ins->eTag.'\1s*'.$tpl_ins ->eフラグ;
$bool_has = $bool_has || preg_match('/'.self::$rule.'/ism', $html);
unset($tpl_ins);
$bool_has を返す;
}
静的プライベート関数 TAG_DealTag($attr, $html, $list) {
preg_match_all('/'.self::$rule.'/ism', $html, $out_matches);
if (!empty($out_matches[0])) {
$child_node = array();
for ($i = 0; $i $child_node[] = $out_matches[3][$i];
$html = str_ireplace($out_matches[3][$i], '{-->>child_node_'.$i.'<<--}', $html);
}
$html = self::TAG_GetData($attr, $html, $list);
for ($i = 0; $i < count($out_matches[0]); $i ++) {
$html = str_ireplace('{-->>child_node_'.$i.'< <--}'、$child_node[$i]、$html);
}
preg_match_all('/'.self::$rule.'/ism', $html, $tmp_matches);
if (!empty($tmp_matches[0])) {
for ($i = 0; $i $callFunc = self::$prefix .ucfirst($tmp_matches[1][$i]);
if (method_exists('Tags', $callFunc)) {
$temp = self::$callFunc($tmp_matches[2][$i], $tmp_matches[3][$i]);
$html = str_ireplace($tmp_matches[0][$i], $temp, $html);
}
}
}
unset($tmp_matches);
}
unset($out_matches); $html を返します。
}
静的プライベート関数 TAG_GetData($attr, $html, $list=false) {
if (!empty($attr)) {
$attr_ins = new Attbt($attr);
$attr_arr = $attr_ins->attrs;
if (is_array($attr_arr)) {
extract($attr_arr, EXTR_OVERWRITE);
$source = テーブル名($source, $column);
$rule = '[フィールド:s*(w+)s*([^]]*?)s*/?]';
preg_match_all('/'.$rule.'/is', $html, $out_matches);
$data_str = '';
$data_ins = 新しい DataSql();
$attr_where = $attr_order = '';
if (!empty($where)) {
$where = str_replace(',', ' and ', $where);
$attr_where = 'どこ'。 $どこ;
}
if (!empty($order)) {
$attr_order = ' '.$order で並べ替えます。
} else {
$fed_name = '';
$fed_ins = $data_ins->GetFedNeedle($source);
$fed_cnt = $data_ins->GetFedCount($fed_ins);
for ($i = 0; $i $fed_flag = $data_ins->GetFedFlag($fed_ins, $i);
if (preg_match('/auto_increment/ism', $fed_flag)) {
$fed_name = $data_ins->GetFedName($fed_ins, $i);
休憩;
}
}
if (!empty($fed_name))
$attr_order = ' '.$fed_name' で注文します。説明';
}
if ($list == true) {
if (empty($source) && empty($sql)) {
exit('标签{list}必ずソースプロパティを指定してください!');
}
$attr_rows = $attr_page = '';
if ($rows > 0) {
$attr_rows = ' 制限 0,'.$rows;
}
if (!empty($sql)) {
$data_sql = $sql;
} else {
$data_sql = 'select * from `'.$source.'`'。
$attr_where.$attr_order.$attr_rows;
}
if ($pages=='true' && !empty($size)) {
$data_num = $data_ins->GetRecNum($data_sql);
$page_cnt = ceil($data_num / $size);
グローバル $ページ;
if (!isset($page) || $page if ($page > $page_cnt) $page = $page_cnt;
$data_sql = 'select * from `'.$source.'`'.$attr_where.
$attr_order.'制限 '.($page-1) * $size.','.$size;
$GLOBALS['cfg_page_curr'] = $page;
$GLOBALS['cfg_page_prev'] = $page - 1;
$GLOBALS['cfg_page_next'] = $page + 1;
$GLOBALS['cfg_page_nums'] = $page_cnt;
if (function_exists('list_pagelink')) {
$GLOBALS['cfg_page_list'] = list_pagelink($page, $page_cnt, 2);
}
}
$data_idx = 0;
$data_ret = $data_ins->SqlCmdExec($data_sql);
while ($row = $data_ins->GetRecArr($data_ret)) {
if ($skip > 0 && !empty($flag)) {
$data_idx != 0 &&
$data_idx % $skip == 0 &&
$data_str .= $flag;
}
$data_tmp = $html;
$data_tmp = str_ireplace('@idx', $data_idx, $data_tmp);
for ($i = 0; $i $data_tmp = str_ireplace($out_matches[0][$i],
$row[$out_matches[ 1][$i]]、$data_tmp);
}
$data_str .= $data_tmp; $data_idx ++;
}
} else {
if (empty($source)) {
exit('标签{data} ソースプロパティを指定する必要があります!');
}
$data_sql = 'select * from `'.$source.
'`'.$attr_where.$attr_order;
$row = $data_ins->GetOneRec($data_sql);
if (is_array($row)) {
$data_tmp = $html;
for ($i = 0; $i $data_val = $row[$out_matches[1][$i]];
if (empty($out_matches[2][$i])) {
$data_tmp = str_ireplace($out_matches[0][$i], $data_val, $data_tmp);
} else {
$attr_str = $out_matches[2][$i];
$attr_ins = 新しい Attbt($attr_str);
$func_txt = $attr_ins->attrs['関数'];
if (!empty($func_txt)) {
$func_tmp =explode('(', $func_txt);
if (function_exists($func_tmp[0])) {
eval('$func_ret ='.str_ireplace(') @me',
'''.$data_val.''', $func_txt));
$data_tmp = str_ireplace($out_matches[0][$i], $func_ret, $data_tmp); ('调用了存在しない関数数!');
}
} else {
exit('标签设置属性無效!')
}
}
}
$data_str .= $data_tmp; ($data_ins);
return $data_str;
} else {
exit('标签设置属性無效!');
exit('没有设置标签属性!'); public function __callStatic($name, $args) {
exit('标签{'.$name.'}存在しません!');
以上は、mvc モードを介した PHP 内の MVC モードのモジュール プレート リリースであり、mvc モードの内容も含まれており、PHP 教則に関心のある友人の助けになることが望まれます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 開発: CodeIgniter を使用して MVC パターンと RESTful API を実装する PHP 開発: CodeIgniter を使用して MVC パターンと RESTful API を実装する Jun 16, 2023 am 08:09 AM

Web アプリケーションは進化し​​続けるため、アプリケーションをより迅速かつ効率的に開発することが重要です。また、RESTful API は Web アプリケーションで広く使用されているため、開発者は RESTful API の作成および実装方法を理解する必要があります。この記事では、CodeIgniter フレームワークを使用して MVC パターンと RESTful API を実装する方法について説明します。 MVC パターン MVC (Model-Vie) の概要

Laravelで実装できる機能や特徴を理解する Laravelで実装できる機能や特徴を理解する Mar 07, 2024 am 08:06 AM

Laravel は、Web 開発の分野で広く使用されている人気のある PHP フレームワークです。開発者が高品質で保守可能な Web アプリケーションを迅速に構築できるようにする多くの強力な機能を提供します。この記事では、Laravel で実装できる関数と機能を詳しく説明し、具体的なコード例を示します。 1.MVCアーキテクチャ Laravelは、MVC(Model-View-Controller)設計パターンに基づいたアーキテクチャを採用し、コードを編成および管理します。

ThinkPHP6 での MVC パターンの使用 ThinkPHP6 での MVC パターンの使用 Jun 20, 2023 am 11:06 AM

ThinkPHP6 は、MVC (Model-View-Controller) パターンを使用してアプリケーションの論理構造を編成する人気の PHP フレームワークです。 MVC パターンは、アプリケーションをモデル、ビュー、コントローラーの 3 つの部分に分割するオブジェクト指向プログラミングの設計パターンです。各部分には独自の独立した責任があるため、アプリケーションの保守と拡張が容易になります。この記事では使い方を紹介します

MVC アーキテクチャ パターンを PHP フレームワークに実装するにはどうすればよいですか? MVC アーキテクチャ パターンを PHP フレームワークに実装するにはどうすればよいですか? Jun 05, 2023 pm 03:31 PM

インターネット技術の急速な発展に伴い、さまざまなプログラミング言語やフレームワークが次々と登場しており、PHPは世界的に人気のあるプログラミング言語としてWeb開発の分野で広く使用されています。 Web アプリケーションが増加し、より複雑になるにつれて、コードをより適切に整理および管理するために、開発者は MVC (モデル-ビュー-コントローラー) アーキテクチャ パターンを採用しました。 MVC パターンは、アプリケーションをデータ (モデル)、ユーザー インターフェイス (ビュー)、コントローラー (C) の 3 つの部分に分割するソフトウェア設計パターンです。

CodeIgniter フレームワークを選択する理由? CodeIgniter フレームワークを選択する理由? Jun 03, 2023 am 08:21 AM

CodeIgniter は、Web アプリケーションを迅速に開発するために広く使用されている、シンプルで軽量な PHP フレームワークです。 2006 年の創設以来、CodeIgniter は多くの開発者にとって選ばれるフレームワークとなっています。この記事では、CodeIgniter フレームワークを選択する理由を探り、その主な利点について説明します。 Lightweight CodeIgniter は軽量なフレームワークであり、フレームワークのコアファイルはわずか 2MB 程度であり、実行速度とパフォーマンスの点で優れています。他の苦しみとともに

PHPでのリクエスト・レスポンスの設計 PHPでのリクエスト・レスポンスの設計 May 23, 2023 am 08:22 AM

Web 開発において、リクエストへのレスポンスは非常に重要な概念です。 PHP 開発者は、リクエスト応答の設計を理解する必要があります。 PHP では、リクエストはクライアントからサーバーに送信されるデータを指します。一般に、このデータはフォーム送信または AJAX リクエストによって送信されます。リクエストの内容には、HTTP リクエスト メソッド、リクエスト ヘッダー、リクエスト パラメータ、リクエスト本文、その他の情報が含まれます。応答は、クライアントの要求に対するサーバーの応答を表します。一般的に、応答の内容には H が含まれる場合があります。

PHP8 フレームワーク開発 MVC モデル: チームの効率を向上させる実践的な方法 PHP8 フレームワーク開発 MVC モデル: チームの効率を向上させる実践的な方法 Sep 11, 2023 pm 07:13 PM

PHP8 フレームワーク開発 MVC パターン: チームの効率を向上させる実践的な方法 今日のソフトウェア開発では、MVC (Model-View-Controller) パターンが Web アプリケーション開発で広く使用されています。アプリケーションの論理部分をモデル、ビュー、コントローラーの 3 つのコンポーネントに分解して、結合度が高く結合度の低いアーキテクチャを実現します。 PHP8 では、より多くの機能と改善が提供され、フレームワーク開発における MVC パターンの適用がより効率的かつ便利になります。この記事では、PHP8フレームワークを使用して開く方法を紹介します。

PHP8 フレームワーク開発 MVC パターン: 課題を解決するための実践的な提案 PHP8 フレームワーク開発 MVC パターン: 課題を解決するための実践的な提案 Sep 11, 2023 pm 01:25 PM

[はじめに] MVC (Model-View-Controller) パターンは、Web アプリケーション開発で広く使用されています。 PHP は非常に人気のあるプログラミング言語であり、Laravel や Symfony などの優れた開発フレームワークが数多くあります。 PHP8 のリリースに伴い、開発者は PHP8 で MVC パターン アプリケーションを適切に開発する方法についていくつかの課題を提起しました。この記事では、開発者がこれらの課題を克服するのに役立ついくつかの実践的な提案を提供します。 [1. PHP8 の新機能

See all articles