PHP 프레임워크 ThinkPHP ThinkPHP: 템플릿 엔진에 대한 자세한 설명

ThinkPHP: 템플릿 엔진에 대한 자세한 설명

Dec 16, 2019 pm 03:32 PM
thinkphp 템플릿 엔진

ThinkPHP: 템플릿 엔진에 대한 자세한 설명

템플릿 엔진의 유래

웹 애플리케이션의 PHP 개발 초기에는 PHP 코드와 HTML 템플릿을 함께 사용하여 탄생했습니다. 백엔드와 프론트엔드의 문제 완전한 분리의 문제(지금은 실제로는 불완전한 분리인 것처럼 보임)로 인해 개발자와 아티스트가 별도로 작업하고 협력할 수 있습니다(실제로 최종 템플릿 작업의 대부분은 여전히 ​​에 의해 수행됩니다). 백엔드 개발자)를 통해 개발 효율성을 높이고 유지 관리를 용이하게 합니다.

PHP의 급속한 성장과 함께 점점 더 많은 템플릿 엔진이 있지만 크게 해석형과 컴파일형의 두 가지 유형으로 나뉩니다. 현재 주류 템플릿 엔진의 대부분은 컴파일됩니다. 즉, 템플릿이 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(View) <=> 템플릿 드라이버(Driver) <=>

뷰와 템플릿 엔진 사이에 드라이버 레이어가 추가되어 다른 템플릿 엔진을 쉽게 교체할 수 있습니다. 일반적으로 우리가 컨트롤러에서 호출하는 할당/가져오기 및 기타 메소드는 실제로 호출되는 thinkView 클래스의 메소드입니다. 물론 필요하다면 컨트롤러에서 템플릿 엔진 클래스를 직접 조작할 수도 있지만, 다른 템플릿 엔진으로 전환하는 것은 불편하다.

가져오기 메서드를 예로 들어 최종 호출 프로세스를 살펴보겠습니다.

think\Controller->fetch();
think\View->fetch();
think\view\driver\Think->fetch();
think\Template->fetch();
로그인 후 복사

가져오기 메서드를 호출할 때 렌더링할 전체 템플릿 파일 이름을 전달하지 않으면 자동으로 파일을 식별합니다. 세 번째 단계에서 렌더링됩니다.

분명히 가장 중요한 단계는 마지막 단계입니다. 템플릿 컴파일 및 실행 과정은 모두

think\Template->fetch();
로그인 후 복사

방법으로 완료됩니다. 이 링크는 크게 여러 프로세스로 나눌 수 있습니다.

1. 페이지 렌더링 캐시 결정 및 읽기

현재 템플릿에 페이지 출력 캐시가 설정되어 렌더링 및 출력된 경우 캐시의 출력 콘텐츠를 직접 읽고 출력합니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

thinkphp 프로젝트를 실행하는 방법 thinkphp 프로젝트를 실행하는 방법 Apr 09, 2024 pm 05:33 PM

ThinkPHP 프로젝트를 실행하려면 다음이 필요합니다: Composer를 설치하고, 프로젝트 디렉터리를 입력하고 php bin/console을 실행하고, 시작 페이지를 보려면 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 Framework를 로컬에서 실행하는 단계: ThinkPHP Framework를 로컬 디렉터리에 다운로드하고 압축을 풉니다. ThinkPHP 루트 디렉터리를 가리키는 가상 호스트(선택 사항)를 만듭니다. 데이터베이스 연결 매개변수를 구성합니다. 웹 서버를 시작합니다. ThinkPHP 애플리케이션을 초기화합니다. ThinkPHP 애플리케이션 URL에 접속하여 실행하세요.

laravel과 thinkphp 중 어느 것이 더 낫나요? laravel과 thinkphp 중 어느 것이 더 낫나요? Apr 09, 2024 pm 03:18 PM

Laravel과 ThinkPHP 프레임워크의 성능 비교: ThinkPHP는 일반적으로 최적화 및 캐싱에 중점을 두고 Laravel보다 성능이 좋습니다. Laravel은 잘 작동하지만 복잡한 애플리케이션의 경우 ThinkPHP가 더 적합할 수 있습니다.

개발 제안: ThinkPHP 프레임워크를 사용하여 비동기 작업을 구현하는 방법 개발 제안: ThinkPHP 프레임워크를 사용하여 비동기 작업을 구현하는 방법 Nov 22, 2023 pm 12:01 PM

"개발 제안: ThinkPHP 프레임워크를 사용하여 비동기 작업을 구현하는 방법" 인터넷 기술의 급속한 발전으로 인해 웹 응용 프로그램은 많은 수의 동시 요청과 복잡한 비즈니스 논리를 처리하기 위한 요구 사항이 점점 더 높아졌습니다. 시스템 성능과 사용자 경험을 향상시키기 위해 개발자는 이메일 보내기, 파일 업로드 처리, 보고서 생성 등과 같이 시간이 많이 걸리는 작업을 수행하기 위해 비동기 작업을 사용하는 것을 종종 고려합니다. PHP 분야에서 널리 사용되는 개발 프레임워크인 ThinkPHP 프레임워크는 비동기 작업을 구현하는 몇 가지 편리한 방법을 제공합니다.

thinkphp를 설치하는 방법 thinkphp를 설치하는 방법 Apr 09, 2024 pm 05:42 PM

ThinkPHP 설치 단계: PHP, Composer 및 MySQL 환경을 준비합니다. Composer를 사용하여 프로젝트를 만듭니다. ThinkPHP 프레임워크와 종속성을 설치합니다. 데이터베이스 연결을 구성합니다. 애플리케이션 코드를 생성합니다. 애플리케이션을 실행하고 http://localhost:8000을 방문하세요.

thinkphp 성능은 어떤가요? thinkphp 성능은 어떤가요? Apr 09, 2024 pm 05:24 PM

ThinkPHP는 캐싱 메커니즘, 코드 최적화, 병렬 처리 및 데이터베이스 최적화와 같은 장점을 갖춘 고성능 PHP 프레임워크입니다. 공식 성능 테스트에 따르면 초당 10,000개 이상의 요청을 처리할 수 있으며 JD.com, Ctrip과 같은 대규모 웹 사이트 및 엔터프라이즈 시스템에서 실제 응용 프로그램으로 널리 사용됩니다.

개발 제안: API 개발을 위해 ThinkPHP 프레임워크를 사용하는 방법 개발 제안: API 개발을 위해 ThinkPHP 프레임워크를 사용하는 방법 Nov 22, 2023 pm 05:18 PM

개발 제안: API 개발을 위해 ThinkPHP 프레임워크를 사용하는 방법 인터넷이 지속적으로 발전하면서 API(응용 프로그래밍 인터페이스)의 중요성이 점점 더 커지고 있습니다. API는 데이터 공유, 함수 호출 및 기타 작업을 실현할 수 있으며 개발자에게 비교적 간단하고 빠른 개발 방법을 제공합니다. 뛰어난 PHP 개발 프레임워크인 ThinkPHP 프레임워크는 효율적이고 확장 가능하며 사용하기 쉽습니다.

See all articles