Symfony视图引擎


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

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

模板

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

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

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

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

枝条引擎

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

句法

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

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

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

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

树枝基本模板位于 “app / Resources / views / base.html.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“http:// localhost:8000 / student / home”来获得结果。

默认情况下,Twig带有一长串标签,过滤器和功能。我们一一详细介绍一下。

标签

Twig支持以下重要标签 -

标签执行类似的功能与它没有打印任何异常的正则表达式。其语法如下 -

{% do 5 + 6 %}

包括

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

{% include 'template.html' %}

扩展

可以使用扩展标签来扩展另一个模板。其语法如下 -

{% 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('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(user) }}

马克斯

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

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

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

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

包括

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

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

随机

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

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

范围

范围函数返回一个包含整数算术级数的列表。例如,

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