twig模板的进一步学习以及在symfony当中的使用
首先,twig可以理解为用于输出html代码的,虽然用PHP等其他语言也可以输出,但是twig更为简洁高效,同时twig模板被编译成原生的php类缓存起来,所以才会这么快,
其实twig跟php类差不多我感觉,可以进行继承重写,创建一个基类模板,之后的模板都可以继承他并且重写他的任何一个block
twig模板可以和for,if语句完美结合,比如下面这个例子,以无序方式循环输出用户名,同时根据用户名是否存在进行不同的操作 ,注意以{% endfor %}来结束for语句
<ul>
{% for user in users if user.active %}
<li>{{ user.username }}</li>
{% else %}
<li>No users found</li>
{% endfor %}
</ul>
下面以一个例子来说明twig其中的继承关系,可以看到base模板当中,定义了三个block,title,sidebar,body块,这里用{%block 块名%} {%endblock%}来定义一个块
title输出该页面的标题,sidebar是旁边的选项,body是文章的具体内容,这里可以看做是让其他模板继承并重写的,
{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Test Application{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block body %}{% endblock %}
</div>
</body>
</html
接下来我们以一个字模板来进行说明,比如现在有一篇文章,当进入该文章页面时,需要显示文章具体内容,文章页面和主页是差不多的,只是基类twig当中的body块是不一样的,
所以只需要重写基类当中的body块就行了,就可以在原页面的基础上,只更改文章的内容而其他地方都是不变的。注意在此之前使用extends继承基类模板,就会自动显示基类模板
当中的内容
{# app/Resources/views/blog/index.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}My cool blog posts{% endblock %}
{% block body %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
说到底twig模板就是将各个页面之间的共性提取出来,写入到基类模板当中去,基类模板的block越多越好,这样页面更为灵活
如果要在子类模板当中在基类模板的某一块的基础上添加内容,而不是完全重写,只需要将 {{ parent() }}放在所需要的块中即可,
对于模板存放位置的说明。
基类模板一般存放在App/Resourses/views当中,可以继承第三方bundle当中的模板,注意如果你想要让基类继承其他的twig,需要放在bundle当中
对于继承路径的说明,
所有目录都是相对于app/resources/views目录的,比如你要继承views/blog的twig模板,需要使用 extends blog/模板名,
对于在一个模板当中引入其他模板的说明
比如现在有一个模板article.html.twig
{# app/Resources/views/article/article_details.html.twig #}
<h2>{{ article.title }}</h2>
<h3 class="byline">by {{ article.authorName }}</h3>
<p>
{{ article.body }}
</p>
然后如果要在一个list.html.twig模板当中使用他的话,
{# app/Resources/views/article/list.html.twig #}
{% extends 'layout.html.twig' %}
{% block body %}
<h1>Recent Articles<h1>
{% for article in articles %}
{{ include('article/article_details.html.twig', { 'article': article }) }}
{% endfor %}
{% endblock %
使用include 包含这个模板进来,路径规则和之前的相似,同样如果需要传入参数的话,{}括起来就行,和数组方式差不多
如果要使用twig跳转到另一个界面的话,使用path函数即可,比如现在有一个路由article,slug为传入的参数
/**
* @Route("/article/{slug}", name="article_show")
*/
跳转时,使用{{ path('路由名称',{参数列表来实现}) }} ,注意你可以写死他们的url,但是使用路由名更为灵活
{% for article in articles %}
<a href="{{ path('article_show', {'slug': article.slug}) }}">
{{ article.title }}
</a>
{% endfor %}
对于输出图片的说明
使用asset进行载入,这里的rel参数规定了指定link和当前链接的关系,具体看文档,这里的文档路径是相对于主机路径的即web目录路径,一般都会存放在web/bundles/scourgenWeb/css/js/png.......
<img src="{{ asset('images/logo.png') }}" alt="Symfony!" />
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" />
最后再对twig模板当中访问一个用户的各种信息的方式
symfony在php,twig引擎当中默认设置一个全局变量APP,可以通过它来访问一个user的信息,这个user可以是一个UserInteface对象,有ToString() 方法的对象,或者常规字符串
app.user
app.session 当前用户的session,
app.request 当前请求对象,目前也不太了解
再说明一下如何对一个控制器进行渲染,在twig之中访问该控制器时,可以获取到相应的值,比如我们在recentArticle当中,用render方法返回文章的信息,注意这里render的第一个参数是需要渲染的twig模板的路径(相对于views目录)
// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller; // ... class ArticleController extends Controller
{
public function recentArticlesAction($max = 3)
{
// make a database call or other logic
// to get the "$max" most recent articles
$articles = ...; return $this->render(
'article/recent_list.html.twig',
array('articles' => $articles)
);
}
}
在twig当中访问这个Action时,直接使用article变量就行了
{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %}
<a href="/article/{{ article.slug }}">
{{ article.title }}
</a>
{% endfor %}
twig使用某个js/css文件,{{ assert('文件名') }}
twig模板的进一步学习以及在symfony当中的使用的更多相关文章
- symfony注册Twig模板中使用自定义PHP方法
// 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 官方文档,https://symfony.com/doc/2.8/templating/twig_extension.html// ...
- abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)
Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...
- SSTI(以Twig模板引擎为例)
一.模板注入与常见Web注入 就注入类型的漏洞来说,常见 Web 注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等.注入漏洞的实质是服务端接受了用户的输入,未 ...
- 原生twig模板引擎详解(安装使用)
最近在学习SSTI(服务器模板注入),所以在此总结一下 0x00 Twig的介绍 什么是Twig? Twig是一款灵活.快速.安全的PHP模板引擎. Twig的特点? 快速:Twig将模板编译为纯粹的 ...
- opencart 引入 TWIG 模板引擎
1.首先将 twig 包放入 system\library 目录. 2.在 system/startup.php 文件最后添加引入语句. require_once(DIR_SYSTEM . 'lib ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- 过实现鹰眼图这个功能来进一步学习MapControl控件
我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...
- 对Linux命令进一步学习vim(二)
今天,进一步学习Linux相关的命令,可能会有重复的地方,但学习本来就是不断重复的过程.故作小记! 1.安装了:vim ,,,一款Linux爱好者经常用到的ide sudo apt-get inst ...
随机推荐
- 使用Docker安装ELK系列(超简单)
root权限 docker版本:1.13.1 ELK版本:6.4.3 项目中均关闭X-Pack 一.安装Elasticsearch 新建elasticsearch目录,并再其下新建文件config/e ...
- DataTable行列转置
DataTable dtNew = new DataTable(); dtNew.Columns.Add("ColumnName", typeof(string)); ; i &l ...
- Ajax简述
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX = 异步 JavaScript和X ...
- Makefile模板(C++)
Makefile的C++的一个模板,可用于根据不同源文件,生成多个可执行文件 . CC = g++ DIR_INC = ./include DIR_SRC = ./src DIR_OBJ = ./ob ...
- jQuery中哪几种选择器
基本选择器:直接根据id,css类名,元素名返回dom元素: 层次选择器:也叫路径选择器: $("div span") 选取<div>里的所有<span>元 ...
- mysql:The user specified as a definer ('xxx'@'%') does not exist 解决方法
发生这种问题.大概率是用户不存在或者是权限不够 用户不存在.用可视化工具新建一个. 权限不够 ,运行下面命令: 如:我的错误: The user specified as a definer ('mo ...
- Nginx开启gzip压缩解决react打包文件过大
用create-react-app创建的react应用打包之后的build js有1M之多. 采用gzip打包传输,可以节约70%左右的带宽 nginx采用gzip打包方式 在nginx配置中添加如下 ...
- 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计
2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...
- Java基础11-List;Set;Map
作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...
- selenium采用xpath方法识别页面元素
有些HTML页面中的元素中属性较少,经常有找不到id.class.name等常用属性的时候,这个时候xpath.css就能很好的识别到我们的元素. Firefox和chrome浏览器中均有xpath. ...