Symfony - 视图引擎



视图层是MVC应用程序的表示层。它将应用程序逻辑与表示逻辑分离。

当控制器需要生成HTML、CSS或任何其他内容时,它会将任务转发给模板引擎。

模板

模板基本上是用于生成任何基于文本的文档(例如HTML、XML等)的文本文件。它用于节省时间并减少错误。

默认情况下,模板可以位于两个不同的位置:

app/Resources/views/ - 应用程序的视图目录可以包含应用程序捆绑包的应用程序布局和模板。它还可以覆盖第三方捆绑包模板。

vendor/path/to/Bundle/Resources/views/ - 每个第三方捆绑包在其“Resources/views/”目录中包含其模板。

Twig 引擎

Symfony 使用一种强大的模板语言,称为Twig。Twig 允许您以非常简单的方式编写简洁易读的模板。Twig 模板很简单,不会处理PHP标签。Twig 执行空白控制、沙盒和自动HTML转义。

语法

Twig 包含三种类型的特殊语法:

  • {{ ... }} - 将变量或表达式的结果打印到模板。

  • {% ... %} - 控制模板逻辑的标签。它主要用于执行函数。

  • {# ... #} - 注释语法。用于添加单行或多行注释。

twig 基本模板位于“app/Resources/views/base.html.twig”

示例

让我们来看一个使用twig引擎的简单示例。

StudentController.php

<?php  
namespace AppBundle\Controller;  

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;  

class StudentController extends Controller { 
   /** 
      * @Route("/student/home") 
   */ 
   public function homeAction() { 
      return $this->render('student/home.html.twig'); 
   } 
}

在这里,render() 方法渲染模板并将该内容放入Response对象中。

现在转到“views”目录,创建一个名为“student”的文件夹,并在该文件夹内创建一个名为“home.html.twig”的文件。在文件中添加以下更改。

home.html.twig

//app/Resources/views/student/home.html.twig  
<h3>Student application!</h3> 

您可以通过请求url“https://127.0.0.1:8000/student/home”来获得结果。

默认情况下,Twig 带有很长的标签、过滤器和函数列表。让我们逐一详细介绍。

标签

Twig 支持以下重要标签:

do

do 标签执行与正则表达式类似的功能,区别在于它不打印任何内容。其语法如下:

{% do 5 + 6 %} 

include

include 语句包含一个模板并将该文件的渲染内容返回到当前命名空间。其语法如下:

{% include 'template.html' %}

extends

extends 标签可用于从另一个模板扩展模板。其语法如下:

{% extends "template.html" %}

block

block 充当占位符并替换内容。块名称由字母数字字符和下划线组成。例如:

<title>{% block title %}{% endblock %}</title>

embed

embed 标签执行 include 和 extends 的组合。它允许您包含另一个模板的内容。它还允许您覆盖包含的模板中定义的任何块,例如扩展模板时。

{% embed “new_template.twig” %} 
   {# These blocks are defined in “new_template.twig" #} 
   {% block center %} 
      Block content 
   {% endblock %} 
{% endembed %} 

filter

filter 部分允许您对模板数据块应用常规 Twig 过滤器。例如:

{% filter upper %} 
   symfony framework 
{% endfilter %} 

这里,文本将更改为大写。

for

for 循环获取序列中的每个项目。例如:

{% for x in 0..10 %} 
   {{ x }} 
{% endfor %}

if

Twig 中的if 语句类似于PHP。表达式计算结果为真或假。例如:

{% if value == true %} 
   <p>Simple If statement</p> 
{% endif %}

过滤器

Twig 包含过滤器。它用于修改内容后再进行渲染。以下是一些值得注意的过滤器。

length

length 过滤器返回字符串的长度。其语法如下:

{% if name|length > 5 %} 
   ... 
{% endif %} 

lower

lower 过滤器将值转换为小写。例如:

{{ 'SYMFONY'|lower }}

它将产生以下结果:

symfony

同样,您可以尝试大写。

replace

replace 过滤器通过替换占位符来格式化给定的字符串。例如:

{{ "tutorials point site %si% and %te%."|replace({'%si%': web, '%te%': "site"}) }} 

它将产生以下结果:

tutorials point website 

title

title 过滤器返回值的标题大小写版本。例如:

{{ 'symfony framework '|title }}

它将产生以下结果:

 Symfony Framework

sort

sort 过滤器对数组进行排序。其语法如下:

{% for user in names|sort %} 
   ... 
{% endfor %}

trim

trim 过滤器修剪字符串开头和结尾的空格(或其他字符)。例如:

{{ '  Symfony!  '|trim }} 

它将产生以下结果:

Symfony!

函数

Twig 支持函数。它用于获得特定结果。以下是一些重要的 Twig 函数。

attribute

attribute 函数可用于访问变量的“动态”属性。其语法如下:

{{ attribute(object, method) }} 
{{ attribute(object, method, arguments) }} 
{{ attribute(array, item) }} 

例如:

{{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}

constant

constant 函数返回指定字符串的常量值。例如:

{{ constant('Namespace\\Classname::CONSTANT_NAME') }}

cycle

cycle 函数循环遍历一系列值。例如:

{% set months = [‘Jan’, ‘Feb’, ‘Mar’] %}  
{% for x in 0..12 %} 
   { cycle(months, x) }} 
{% endfor %}

date

将参数转换为日期以允许日期比较。例如:

<p>Choose your location before {{ 'next Monday'|date('M j, Y') }}</p> 

它将产生以下结果:

Choose your location before May 15, 2017

参数必须采用PHP支持的日期和时间格式之一。

您可以将时区作为第二个参数传递。

dump

dump 函数转储有关模板变量的信息。例如:

{{ dump(user) }}

max

max 函数返回序列中的最大值。例如:

{{ max(1, 5, 9, 11, 15) }}

min

min 函数返回序列中的最小值。例如:

{{ min(1, 3, 2) }}

include

include 函数返回模板的渲染内容。例如:

{{ include('template.html') }}

random

random 函数生成一个随机值。例如:

{{ random([‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’]) }} 
{# example output: Jan #} 

range

range 函数返回包含整数算术级数的列表。例如:

{% for x in range(1, 5) %} 
   {{ x }}, 
{% endfor %} 

它将产生以下结果:

1,2,3,4,5

布局

布局表示多个视图的公共部分,例如页眉和页脚。

模板继承

一个模板可以被另一个模板使用。我们可以使用模板继承的概念来实现这一点。模板继承允许您构建一个包含网站所有公共元素(定义为块)的基本“布局”模板。

让我们来看一个简单的例子来了解更多关于模板继承的信息。

示例

考虑位于“app/Resources/views/base.html.twig”的基本模板。在文件中添加以下更改。

base.html.twig

<!DOCTYPE html> 
<html> 
   <head> 
      <meta charset = "UTF-8"> 
      <title>{% block title %}Parent template Layout{% endblock %}</title> 
   </head> 
</html>

现在转到位于“app/Resources/views/default/index.html.twig“的索引模板文件。在其中添加以下更改。

index.html.twig

{% extends 'base.html.twig' %}  
{% block title %}Child template Layout{% endblock %}

这里,{% extends %} 标签通知模板引擎首先评估基本模板,该模板设置布局并定义块。然后渲染子模板。子模板可以扩展基本布局并覆盖标题块。现在,请求url“https://127.0.0.1:8000”,您可以获得其结果。

资源

资源管理Web资源(如CSS样式表、JavaScript文件和图像文件)的URL生成和版本控制。

JavaScript

要包含JavaScript文件,请在任何模板中使用javascripts标签。

{# Include javascript #} 
{% block javascripts %} 
   {% javascripts '@AppBundle/Resources/public/js/*' %} 
      <script src="{{ asset_url }}"></script> 
   {% endjavascripts %} 
{% endblock %} 

样式表

要包含样式表文件,请在任何模板中使用stylesheets标签。

{# include style sheet #} 
{% block stylesheets %} 
   {% stylesheets 'bundles/app/css/*' filter = 'cssrewrite' %} 
      <link rel = "stylesheet" href="{{ asset_url }}" />
   {% endstylesheets %} 
{% endblock %}

图像

要包含图像,您可以使用image标签。它定义如下。

{% image '@AppBundle/Resources/public/images/example.jpg' %} 
   <img src = "{{ asset_url }}" alt = "Example" /> 
{% endimage %} 

组合资源

您可以将多个文件组合成一个文件。这有助于减少HTTP请求的数量,并提高前端性能。

{% javascripts 
   '@AppBundle/Resources/public/js/*' 
   '@AcmeBarBundle/Resources/public/js/form.js' 
   '@AcmeBarBundle/Resources/public/js/calendar.js' %} 
   <script src = "{{ asset_url }}"></script> 
{% endjavascripts %}
广告