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