ホームページ PHPフレームワーク ThinkPHP ThinkPHP: テンプレートエンジンの詳細説明

ThinkPHP: テンプレートエンジンの詳細説明

Dec 16, 2019 pm 03:32 PM
thinkphp テンプレートエンジン

ThinkPHP: テンプレートエンジンの詳細説明

#テンプレート エンジンの起源 # PHP による WEB アプリケーション開発の初期には、PHP コードと HTML テンプレートが混在していましたが、テンプレート エンジンの誕生は、主にバックエンドとフロントエンドの完全な分離の問題を解決するためにありました (現在では実際には不完全ですが)これにより、開発者とアーティストが協力して作業できるようになり (実際には、最終的なテンプレート作業のほとんどは依然としてバックエンド開発者によって行われます)、それによって開発効率が向上し、メンテナンスが容易になります。

PHP の急速な成長に伴い、テンプレート エンジンはますます増えていますが、大きく分けてインタプリタ型とコンパイル型の 2 種類に分かれており、現在主流のテンプレート エンジンのほとんどはコンパイル型です。テンプレートはPHPファイルにコンパイルされて実行されるため、テンプレートファイル自体を変更しない限り、旧Smartyのように再コンパイルする必要はありません。 tinybutstrong など、解釈されたテンプレート エンジンは、実行されるたびにテンプレート解析プロセスを実行します。

ThinkPHP は、XML タグ ライブラリ技術をベースとしたコンパイル済みテンプレート エンジンを最初から内蔵しており、Struts から早期に参照され、新しいアイデアを吸収して常に進化しています。

テンプレート エンジンの選択方法

現在主流のフレームワークにはテンプレート エンジン コンポーネントが含まれているか、テンプレート エンジンの実装がカプセル化されているため、組み込みを選択します。ソリューション このソリューションは、機能性と安定性が保証された最良の選択です。現在、最も人気のあるテンプレート エンジンは、Laravel 独自の Blade テンプレート エンジンと Symfony 独自の Twig テンプレート エンジンです。

テンプレート エンジン拡張機能をインストールすると、ThinkPHP で Angular、Twig、Blade などのテンプレート エンジンを簡単に使用したり、テンプレート エンジンをまったく使用せずに PHP ファイルを直接テンプレートとして使用したりできます。

近年、3大フロントエンドフレームワーク(React/Vue/Angular)の人気により、フロントエンドとバックエンドを分けて開発することが徐々に主流になってきており、ThinkPHP5.0ではAPI 開発に位置付けられ、テンプレート エンジンの概念が弱体化されました。 ThinkPHP バージョン 5.1 のテンプレート エンジンは内部的に再構築され、テンプレート タグが使いやすくなり、PHP 構文に近づきました。

少なくともほとんどの新しいアプリケーションでは、サーバーへの負荷を可能な限り軽減し、フロントエンドとバックエンドのテストを容易にするために、より主流のフロントエンドとバックエンドの分離設計を選択する必要があります。別々に。市場では Vue や ThinkPHP を使用した製品を偶然目にすることがあります (ThinkPHP Developer Weekly の前号でいくつかの製品が報告されています)。古いプロジェクト、特にコンテンツ管理製品を保守している場合は、引き続きテンプレート エンジンを使用する可能性があります。

この状況を考慮して、ThinkPHP フレームワークの次のバージョンにはテンプレート エンジンが組み込まれなくなりますが、テンプレート エンジンを使用する必要がある開発者は引き続き公式の独立した think-template クラス ライブラリを使用できます。具体的な使い方については、こちらの記事をご覧ください。

次のセクションでは、主に ThinkPHP の組み込みテンプレート エンジンの使用法とテクニックをまとめます。

テンプレート実行プロセス

システム内でのテンプレートエンジンの呼び出し関係は次のとおりです。

View (ビュー) < ;=> テンプレート ドライバー <=> テンプレート エンジン

ドライバー層はビューとテンプレート エンジンの間に追加されるため、他のテンプレート エンジンを簡単に置き換えることができます。通常、コントローラー内で呼び出す assign/fetch およびその他のメソッドは、実際には呼び出される think\View クラスのメソッドです。もちろん、必要に応じて、コントローラー内のテンプレート エンジン クラスを直接操作することもできますが、他のテンプレート エンジンに切り替えるのは不便です。

fetch メソッドを例として、最終的な呼び出しプロセスを見てみましょう。

think\Controller->fetch();
think\View->fetch();
think\view\driver\Think->fetch();
think\Template->fetch();
ログイン後にコピー

fetch メソッドを呼び出すときにレンダリングされる完全なテンプレート ファイル名を渡さなかった場合, 3 番目の「実行中にレンダリングされるテンプレート ファイルを自動的に識別する」ステップに表示されます。

明らかに、最も重要なステップは最後のステップです。テンプレートのコンパイルと実行のプロセスは、すべて

think\Template->fetch();
ログイン後にコピー

メソッドによって完了します。このリンクは、大きくいくつかのプロセスに分けることができます。

1. ページ レンダリング キャッシュを決定して読み取る

現在のテンプレートがページ出力キャッシュを設定し、レンダリングおよび出力されている場合、キャッシュは次のようになります。 read. 出力内容がそのまま出力されます。

if (!empty($this->config[&#39;cache_id&#39;]) && $this->config[&#39;display_cache&#39;]) {
    // 读取渲染缓存
    $cacheContent = $cache->get($this->config[&#39;cache_id&#39;]);
    if (false !== $cacheContent) {
        echo $cacheContent;
        return;
    }
}
ログイン後にコピー

2. テンプレート ファイルを見つけます

実際のテンプレート ファイルの配置操作は、テンプレート エンジン クラスの parseTemplateFile メソッドによって実装されます。このメソッドのロジックは実際には次のとおりです。ビュードライバークラスのparseTemplateと同じメソッドで、最終的なテンプレートファイルが存在しない場合は、テンプレートファイルが存在しないという例外がスローされます。

$template = $this->parseTemplateFile($template);
ログイン後にコピー

3. コンパイル キャッシュの決定

現在のテンプレート ファイルがコンパイルされている場合、キャッシュがまだ有効であるかどうかを判断します。解析を繰り返してキャッシュを直接読み取る必要はありません。これは checkCache メソッドによって行われます。

if (!$this->checkCache($cacheFile)) {
    // 缓存无效 重新模板编译
    $content = file_get_contents($template);
    $this->compiler($content, $cacheFile);
}
ログイン後にコピー

4. テンプレートのコンパイルとキャッシュ

这一步骤是模板引擎最核心的环节,也是功能最复杂的地方,由compiler方法负责完成,主要是解析当前模板文件中的模板标签语法为PHP可执行代码,然后生成一个模板解析缓存文件,也就是所谓的模板“编译”,其中使用了大量的正则表达式替换技术,虽然正则解析有一定的性能开销,但得益于一次解析多次调用的缓存原理,基本上模板解析的性能开销不会影响实际使用的性能。

模板编译方法的关键代码是parse方法,parse方法负责对模板文件中的标签进行解析,然后写入编译缓存文件,编译缓存默认使用的是文件缓存,支持扩展。

5、读取编译缓存

模板编译的过程只是生成了模板编译缓存文件,并没有真正载入模板,这一步骤就是载入模板编译缓存,然后导入模板变量。实现方法可以参考think\template\driver\File类的read方法。

public function read($cacheFile, $vars = [])
{
    $this->cacheFile = $cacheFile;
    if (!empty($vars) && is_array($vars)) {
        // 模板阵列变量分解成为独立变量
        extract($vars, EXTR_OVERWRITE);
    }
    //载入模版缓存文件
    include $this->cacheFile;
}
ログイン後にコピー

6、缓存页面输出

如果当前模板渲染的时候开启了页面输出缓存,就会这一步生成页面渲染后的输出缓存。

模板编译原理

我们来了解下ThinkPHP的模板引擎的实现原理。前面提到过,ThinkPHP的模板引擎最早源于Struts的设计理念,基于XML和标签库的技术实现。在设计模板语言的时候使用系统固定的标签来实现普通的变量输出功能(所以称之为普通标签),而利用XML标签库技术实现的动态标签用于变量的控制或者条件判断输出。

普通标签的解析是由think\Template类的parseTag方法完成的,主要实现了下面几个模板功能:

·变量输出(包括系统变量);

·函数过滤;

·变量运算;

·三元运算;

·执行函数以及输出结果;

·模板注释。

标签库采用的是动态扩展的设计方案,采用了类似XML的闭合/开放定义方式(这个其实也是目前模板引擎的一个局限所在),例如下面的这个:

// 闭合类型标签
<tagLib:tagName name="value" >
...
</tagLib:tagName>
// 开放类型标签
<tagLib:tagName name="value" />
ログイン後にコピー

tagLib就代表了一个标签库(类),后面的tagName标签就表示该标签库下面的某个标签(通常对应了标签库类的某个方法),后面的属性就是该标签支持的属性定义。具体该标签的属性和功能则完全由标签库类的这个方法来决定。

可以在模板开头明确指出,当前模板使用了哪些标签库

{taglib name="html,article" /}
ログイン後にコピー

所以要扩展模板引擎的功能只需要通过扩展一个标签库类就可以了。大多数的内容管理系统都会定义一套自己的模板二次开发标签,利用标签库功能就可以很方便的定义一套属于自己的标签功能。

系统内置了一套标签库Cx,主要用于文件包含、条件控制、循环输出等功能。内置标签库在使用的时候无需引入,而且在使用的时候可以省略标签库前缀,例如:

{foreach $list as $key=>$vo } 
    {$vo.id}:{$vo.name}
{/foreach}
ログイン後にコピー

这个模板语法相信PHP开发的很容易上手,上面的标签解析由think\template\taglib\Cx类的tagForeach方法完成,该方法的返回值是一个字符串,其实就是最终会解析成的一段包含变量的PHP可执行代码。

到这里,模板引擎的执行过程和原理现在基本就明白了,剩下的就是模板标签的解析细节,考验的就是正则表达式的掌握程度了。本文就不做深入了,有兴趣的朋友可以去看一些正则表达式的相关资料(例如这本《正则指引》,开发者周刊第14期也提供了一些在线的正则工具)。

遵循的原则

使用模板引擎,要尽量遵循几个重要的原则。

不要在模板文件中添加任何的业务逻辑

模板的作用主要是进行模板变量的控制和输出,不要在模板文件中添加业务逻辑代码。

明确指定渲染模板

养成明确指定渲染模板的好习惯,避免当方法名发生变化,或者被其它方法调用的时候发生错误。也不易受模板命名规范的影响。

变量统一赋值

使用assign方法或者在view助手函数的时候,统一一次传入模板变量。不要多次赋值,以免混乱。

系统变量无需赋值到模板

对于系统变量(包括请求变量、$_SESSION和$_SERVER等系统变量)无需进行模板变量赋值,可以直接在模板中输出。

常见问题

这里总结一下经常会遇到的一些常见问题。

修改定界符

可以通过模板配置文件修改模板标签的定界符。

例如,修改普通标签定界符

&#39;tpl_begin&#39; => &#39;{{&#39;, // 模板引擎普通标签开始标记
&#39;tpl_end&#39; => &#39;}}&#39;, // 模板引擎普通标签结束标记
ログイン後にコピー

标签库标签定界符

&#39;taglib_begin&#39; => &#39;<{&#39;, // 标签库标签开始标记
&#39;taglib_end&#39; => &#39;}>&#39;, // 标签库标签结束标记
ログイン後にコピー

保持原样输出

如果担心模板标签和JS代码产生混淆,可以使用literal标签

{literal} Hello,{$name}! {/literal}
ログイン後にコピー

页面最终会直接输出

Hello,{$name}!
ログイン後にコピー

避免输出转义

5.1版本为了避免XSS攻击,默认对模板变量的输出使用了安全转义,默认的转义函数是htmlentities,你可以通过更改default_filter配置改变默认的转义函数。

如果你不需要对某个模板变量输出进行转义(例如包含了HTML代码),可以使用:

{$data.content|raw}
ログイン後にコピー

分页输出就是一个需要输出HTML的典型例子,因此必须增加|raw。

关于模板主题

新版取消了原来的模板主题功能,因为模板主题对模板引擎来说,其实无非是一个模板目录,完全可以根据自己的需求控制。

例如

$theme = &#39;blue&#39;;
$this->fetch(&#39;/&#39; . $theme. &#39;/user/index&#39;);
ログイン後にコピー

或者动态设置模板引擎的view_path参数

$this->view->config(&#39;view_path&#39;, \think\facade\App::getModulePath(). &#39;view/&#39;. $theme . &#39;/&#39;);
ログイン後にコピー

如何关闭模板缓存

由于是编译型模板引擎,模板标签不能被直接执行,必须编译成PHP语法后才能执行,因此不能关闭模板编译缓存,模板引擎每次执行渲染的时候会检测模板文件是否有变化,当模板文件的修改时间超过模板编译缓存的修改时间后,模板引擎会自动更新编译缓存。

但你可以强制模板引擎每次都重新编译,只需要在配置文件中设置

&#39;tpl_cache&#39; => false, // 关闭模板缓存
ログイン後にコピー

使用PHP作为模板引擎

如果不希望使用内置的模板引擎,直接使用PHP作为模板引擎,可以配置

&#39;type&#39; => &#39;php&#39;,
ログイン後にコピー

配置使用PHP作为模板引擎的话,是不会生成模板编译缓存的。

如何使用第三方模板引擎

系统支持扩展其它的第三方模板引擎,你只需要开发一个模板引擎驱动,目前已经支持的第三方模板引擎包括Smarty、Twig和Blade。

如何跨模块输出模板

要渲染一个跨模块的模板文件,你需要使用

// 渲染user模块的模板文件
$this->fetch(&#39;User@order/index&#39;);
ログイン後にコピー

是否支持变量运算

可以直接在模板文件中进行变量运算而不需要在控制器中进行运算后再赋值都模板变量输出。

{$score1+$score2}
{$count++}
ログイン後にコピー

文件包含是否支持变量

include标签可以支持传入变量,但只能使用

{include file="$file" /}
ログイン後にコピー

而不能使用

{include file="file_$name" /}
ログイン後にコピー

可以支持模板输出替换么

支持两个方式对模板进行输出替换,如果需要对模板文件的内容进行替换,可以配置:

&#39;tpl_replace_string&#39;  =>  [
    &#39;__STATIC__&#39;=>&#39;/static&#39;,
&#39;__JS__&#39; => &#39;/static/javascript&#39;,
]
ログイン後にコピー

如果是对模板渲染输出的内容进行替换,可以在控制器中使用视图过滤功能:

public function index()
{
    // 使用视图输出过滤
    return $this->filter(function($content){
    return str_replace("\r\n",&#39;<br/>&#39;,$content);
    })->fetch();
}
ログイン後にコピー

模板继承的block是否支持嵌套

目前模板继承的block无法支持嵌套功能,你应该使用其它方式解决。

众多ThinkPHP入门教程,尽在PHP中文网,欢迎在线学习!

本文转自:https://blog.thinkphp.cn/902998

以上がThinkPHP: テンプレートエンジンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

thinkphpプロジェクトの実行方法 thinkphpプロジェクトの実行方法 Apr 09, 2024 pm 05:33 PM

ThinkPHP プロジェクトを実行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を実行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

thinkphp にはいくつかのバージョンがあります thinkphp にはいくつかのバージョンがあります Apr 09, 2024 pm 06:09 PM

ThinkPHP には、さまざまな PHP バージョン向けに設計された複数のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

thinkphpの実行方法 thinkphpの実行方法 Apr 09, 2024 pm 05:39 PM

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 ThinkPHP ルート ディレクトリを指す仮想ホスト (オプション) を作成します。データベース接続パラメータを構成します。 Webサーバーを起動します。 ThinkPHP アプリケーションを初期化します。 ThinkPHP アプリケーションの URL にアクセスして実行します。

laravelとthinkphpではどちらが優れていますか? laravelとthinkphpではどちらが優れていますか? Apr 09, 2024 pm 03:18 PM

Laravel フレームワークと ThinkPHP フレームワークのパフォーマンスの比較: ThinkPHP は、最適化とキャッシュに重点を置いて、一般に Laravel よりもパフォーマンスが優れています。 Laravel は優れたパフォーマンスを発揮しますが、複雑なアプリケーションの場合は、ThinkPHP の方が適している可能性があります。

thinkphpのインストール方法 thinkphpのインストール方法 Apr 09, 2024 pm 05:42 PM

ThinkPHP のインストール手順: PHP、Composer、および MySQL 環境を準備します。 Composer を使用してプロジェクトを作成します。 ThinkPHP フレームワークと依存関係をインストールします。データベース接続を構成します。アプリケーションコードを生成します。アプリケーションを起動し、http://localhost:8000 にアクセスします。

開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 Nov 22, 2023 pm 12:01 PM

「開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法」 インターネット技術の急速な発展に伴い、Web アプリケーションには、多数の同時リクエストと複雑なビジネス ロジックを処理するための要件が​​ますます高まっています。システムのパフォーマンスとユーザー エクスペリエンスを向上させるために、開発者は多くの場合、電子メールの送信、ファイルのアップロードの処理、レポートの生成など、時間のかかる操作を実行するために非同期タスクの使用を検討します。 PHP の分野では、人気のある開発フレームワークとして ThinkPHP フレームワークが、非同期タスクを実装するための便利な方法をいくつか提供しています。

thinkphpのパフォーマンスはどうですか? thinkphpのパフォーマンスはどうですか? Apr 09, 2024 pm 05:24 PM

ThinkPHP は、キャッシュ メカニズム、コードの最適化、並列処理、データベースの最適化などの利点を備えた高性能 PHP フレームワークです。公式パフォーマンステストでは、1秒あたり10,000以上のリクエストを処理できることが示されており、実際のアプリケーションではJD.comやCtripなどの大規模なWebサイトやエンタープライズシステムで広く使用されています。

ファイル転送機能を実現するThinkPHP6とSwooleをベースとしたRPCサービス ファイル転送機能を実現するThinkPHP6とSwooleをベースとしたRPCサービス Oct 12, 2023 pm 12:06 PM

ThinkPHP6 と Swoole をベースとした RPC サービスがファイル転送機能を実装 はじめに: インターネットの発展に伴い、ファイル転送は私たちの日常業務においてますます重要になってきています。この記事では、ファイル転送の効率化とセキュリティを向上させるために、ThinkPHP6とSwooleをベースとしたファイル転送機能を実現するRPCサービスの具体的な実装方法を紹介します。 WebフレームワークとしてThinkPHP6を使用し、SwooleのRPC機能を利用してサーバー間のファイル転送を実現します。 1. 環境基準

See all articles