- Symfony 教程
- Symfony - 主页
- Symfony - 简介
- Symfony - 安装
- Symfony - 架构
- Symfony - 组件
- Symfony - 服务容器
- Symfony - 事件和事件监听器
- Symfony - 表达
- Symfony - 捆绑包
- 创建一个简单的 Web 应用程序
- Symfony - 控制器
- Symfony - 路由
- Symfony - 视图引擎
- Symfony - Doctrine ORM
- Symfony - 表单
- Symfony - 验证
- Symfony - 文件上传
- Symfony - Ajax 控制
- Cookie 和会话管理
- Symfony - 国际化
- Symfony - 日志记录
- Symfony - 电子邮件管理
- Symfony - 单元测试
- Symfony - 高级概念
- Symfony - REST 版
- Symfony - CMF 版
- 完整的工作示例
- Symfony 有用资源
- Symfony - 快速指南
- Symfony - 有用的资源
- Symfony - 讨论
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 %}