Symfony - 视图引擎


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

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

模板

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

默认情况下,模板可以驻留在两个不同的位置 -

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

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

树枝引擎

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

句法

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

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

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

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

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

例子

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

学生控制器.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“http://localhost:8000/student/home”来获取结果。

默认情况下,Twig 附带一长串标签、过滤器和函数。我们来一一详细了解一下。

标签

Twig 支持以下重要标签 -

do标记执行与正则表达式类似的功能但它不打印任何内容。其语法如下 -

{% do 5 + 6 %} 

包括

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

{% include 'template.html' %}

延伸

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

{% extends "template.html" %}

堵塞

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

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

嵌入

嵌入标签执行包含和扩展的组合。它允许您包含另一个模板的内容。它还允许您覆盖所包含模板内定义的任何块,例如在扩展模板时。其语法如下 -

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

筛选

过滤器部分允许您在模板数据块上应用常规 Twig 过滤器。例如,

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

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

为了

For循环获取序列中的每个项目。例如,

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

如果

Twig 中的if语句与 PHP 类似。该表达式的计算结果为 true 或 false。例如,

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

过滤器

Twig 包含过滤器。它用于在渲染之前修改内容。以下是一些值得注意的过滤器。

长度

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

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

降低

下层过滤器将值转换为小写。例如,

{{ 'SYMFONY'|lower }}

它将产生以下结果 -

symfony

同样,您可以尝试使用大写。

代替

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

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

它将产生以下结果 -

tutorials point website 

标题

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

{{ 'symfony framework '|title }}

它将产生以下结果 -

 Symfony Framework

种类

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

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

修剪

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

{{ '  Symfony!  '|trim }} 

它将产生以下结果 -

Symfony!

功能

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

属性

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

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

例如,

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

持续的

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

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

循环

循环函数在值数组上循环。例如,

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

日期

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

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

它将产生以下结果 -

Choose your location before May 15, 2017

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

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

倾倒

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

{{ dump(user) }}

最大限度

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

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

最小

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

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

包括

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

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

随机的

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

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

范围

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”的索引模板文件。在其中添加以下更改。

索引.html.twig

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

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

资产

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

JavaScript

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

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

样式表

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

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

图片

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

{% 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 %}