Symfony2模版引擎使用表达手册,FOSUserBundle用户登录验证

    symfony是1个由组件构成的框架,登录验证的也是由局地零部件构成,上边就介绍一下FOSUserBundle的利用。

正文实例讲述了Symfony2框架成立项目与模板设置的主意。分享给大家供大家参考,具体如下:

一 、基本选拔

本文实例讲述了Symfony2学习笔记之模板用法。分享给大家供大家参考,具体如下:

      以symfony 3.3为例,

环境准备与概览

{{ demo }}输出二个demo变量;

大家知晓,controller负责处理每1个进来Symfony2应用程序的央求。实际上,controller把大多数的辛勤工作都寄托给了此外地点,以使代码能够被测试和录取。当三个controller需求生成HTML,CSS大概此外剧情时,它把那几个工作给了二个模板化引擎。

Symfony2模版引擎使用表达手册,FOSUserBundle用户登录验证。      首先大家须求先安装一下FOSUserBundle。

司空见惯于在windows使用netbean编辑器并行使virtualbox虚拟centos系统,
预将nginx+php-fpm+mysql,  当然apache也是不易的接纳,  
使用

 

模板:

       第叁步:需求先下载FOSUserBundle

壹 、下载与环境设置

{% func %}日常是富含2个twig函数例如 for;

2个模板仅仅是一个文书文件,它能生成自由的文本格式(HTML,XML,CSV,LaTex…)。最资深的模板类型正是PHP模板了,能够被PHP解析的公文文件,它糅合了文本和PHP代码。

        composer require friendsofsymfony/user-bundle “~2.0”

  1. 什么于centos上边建立开发条件不再详述,
    当然也得以在windows下面建立开发条件。

  2. 有关选择 symfony代替127.0.0.1 在liunx系统中期维修改/etc/hosts文件,
    win7系统中期维修改 C:\Windows\System32\drivers\etc\host
    文件(须要用管理员权限打开)

举个for循环的事例:

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to Symfony!</title>
  </head>
  <body>
    <h1><?php echo $page_title ?></h1>
    <ul id="navigation">
      <?php foreach ($navigation as $item): ?>
        <li>
          <a href="<?php echo $item->getHref() ?>">
            <?php echo $item->getCaption() ?>
          </a>
        </li>
      <?php endforeach; ?>
    </ul>
  </body>
</html>

        第3步:须要在根本之中注册它,

参加类似于IP 别名1 别名2的内容即可, 如:

{% for i in 0..10 %}

然则Symfony2包中负有一种更加强硬的模板化语言叫Twig。
它同意你写简洁,可读法模板语言。对页面设计师更融洽,在重重地方比PHP模板更抓牢大。

      亚洲必赢官网 1

复制代码 代码如下:

  <em>{{ i }}</em>

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to Symfony!</title>
  </head>
  <body>
    <h1>{{ page_title }}</h1>
    <ul id="navigation">
      {% for item in navigation %}
        <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
      {% endfor %}
    </ul>
  </body>
</html>

      第2步:创造用户类

# /etc/hosts 127.0.0.1 symblog dev symfony

{% endfor %}

在那一个Twig文件中,定义了五个档次的专门语法

        那一个包的靶子是将一部分User类保存到数据库(MySql,MongoDB,CouchDB等)。那么,你的首先份工作正是User为你的应用程序制造2个类。那么些类能够无限制翻动和操作:添加你觉得有效的别样性质或格局。

3.手动下载symfony2, 也能够参见那个页面用Composer
进行设置。

自然也能够打字与印刷对象,例:

{{…}} : “说一些事”,
打字与印刷三个变量或许叁个表明式的值到模板。
{%…%} :
“做一些事”,控制模板逻辑的标签,它用来实施比如for循环语句等。
{# 这是一个注释 #}, “注释”。

        该bundle提供了已经为大部分字段映射的基类,以便更便于地创制您的实体。

唯一供给留意的是: app/cache
和app/logs目录须求设置成777权力。windows的支出条件应该不存在这几个难点。

{% for user in users %}

Twig也隐含filters,在渲染从前修改内容。上面的说话突显把title变量全体渲染为重型。

                   
亚洲必赢官网 2

  1. 修改apache
    或者nginx配置文件symfony域名指向下载的symfony文件的web目录。

<span>user.username</span>

{{ title|upper }}

      a)Doctrine ORM用户类

那时候应有能够通过 访问到symfony的暗中认可页面,
有多少个demo能够参考学习。

{% endfor %}

Twig暗中同意景况下有一大群的竹签(tags)和过滤器(filters)能够行使。当然你也能够依照必要加上扩张。注册3个Twig增添相当简单,创建3个新劳动并把它标志为Twig.extension
标签。就跟你看到的一模一样,Twig也支撑成效和新功能的增进。比如,下边选拔1个规范的for标签和cycle作用函数来打字与印刷十一个div
标签,用odd,even 类代替。

      亚洲必赢官网 3

亚洲必赢官网 4

注:users是从控制器中传播的对象参数

{% for i in 0..10 %}
<div alss="{{ cycle(['odd','even'],i) }}">
<!--一些其它HTML -->
</div>
{% emdfor %}

      实体名称是可更改的,作者的实业原本的称谓是BlogsUser,为了方便使用Fosuserbundle下的实体所以举办了改变,也不改变依照个人喜好。

app_dev.php 默许加载了一个开发工具条在底下, 展现了近年来页面包车型地铁一对音信,
极大地方便了先后的调节, 只有当环境变量为dev时才会展现。

 

Twig模板缓存

      b)MongoDB用户类

  1. 动用composer安装时, 会提醒输出mysql等连锁新闻, 要求修改那一个音信,
    大概是直接下载的文件, 能够进去页面包车型地铁“Configure” 进行连锁设置。

{{# #}}注释;

Twig一点也不慢。
每一个Twig模板被编写翻译到原生的PHP类,它将在运行时被渲染。编写翻译过的类被保存在app/cache/{environment}/twig
目录下并在有个别情状下,对全体调节和测试相当管用。当debug形式可用时,三个twig模板假若发生变更将会被电动重新编写翻译。那就代表你能够在付出进程中随心所欲的改动模板,而不要担心供给去破除内部存款和储蓄器了。当debug情势被关门时,你不能够不手动的解除Twig缓存目录,以便能够再度生成Twig模板。

      亚洲必赢官网 5

Bundles(或许能够称之为包, 束, 程序集,恐怕项目,
依然用英文吧)是symfony的基本功东东, 叁个个享受出去可重新使用的代码封装,
甚至于symfony本身是用作三个bundles运行的。  包含控制器、模块、模板,
甚至于图像与js, css样式表等财富。   很糊涂的东西,
不同不一样的bundles使用了php5.3现在的命名空间, 大部分cpenal,
da虚拟主机好像只有php5.2版本吧, 不能够运维symfony2了。

{{ demo | upper }} 将demo转化为大写,那是二个过滤器的例证;

模板继承和布局

      c)CouchDB用户类

贰 、创制二个Bundle

 

多数的时候,模板在项目中用来共享通用的要素,比如header,footer,sidebar等等。在Symfony第22中学,我们将接纳区其余盘算角度来相比较那些题材。八个模板能够被别的的模版装饰。那个的行事规律跟PHP类极度像,模板继承让您能够创建3个基础”layout”模板,它包涵你的站点的富有通用成分并被定义成blocks。那里的block可以类比为PHP基类的不二法门。
三个字模板能够继续基础layout模板人己一视写它任何三个block。

      亚洲必赢官网 6

在底下的例子上校创设2个博客,  Symfony 提供了汪洋工具来十分的快地开创项目。
比如我们得以用它来火速创造四个博客的基础bundle.

二 、模版继承

今昔率先创立2个base layout文件:

      第⑥步:配置应用程序的security.yml

复制代码 代码如下:

在app/Resources/views目录下暗中认可会有2个base.html.twig

Twig:

      为了让Symfony的金昌组件使用FOSUserBundle,必须告诉它在security.yml文件中那样做。该security.yml文件是含有应用程序基本安全布置的任务。

php app/console generate:bundle –namespace=Blogger/BlogBundle
–format=yml

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>
{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; 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>

      亚洲必赢官网 7

运作后直接选择具有的暗中同意设置即可。 能够方便地开创大家所必要的主导控制器,
模块与模板等。 包涵了上面包车型大巴一颦一笑:

接下来将自身的模版文件三番五次此

PHP代码格式:

      第五步:需要在config.yml配置FOSUserBundle

注册Bundles

{% 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 %}
<!-- app/Resources/views/base.html.php -->
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title><?php $view['slots']->output('title', 'Test Application') ?></title>
  </head>
  <body>
    <div id="sidebar">
      <?php if ($view['slots']->has('sidebar')): ?>
        <?php $view['slots']->output('sidebar') ?>
      <?php else: ?>
        <ul>
          <li><a href="/">Home</a></li>
          <li><a href="/blog">Blog</a></li>
        </ul>
      <?php endif; ?>
    </div>
    <div id="content">
      <?php $view['slots']->output('body') ?>
    </div>
  </body>
</html>

      亚洲必赢官网 8

在symfony中颇具应用的bundles都需要先被登记,
有个别bundles只会使用于开发测试环境(dev or test), 如前文提及的开发工具条.
下边那断代码突显了bundles创建命令怎么样注册BloggerBlogBundle这几个bundle.

::base.html.twig表示此文件放在app/Resources/view目录下

其一模板定义了主导的HTML起初文档是贰个简单的两列式页面。在这几个页面中有三处{%
block
%}定义,分别定义了title,sidebar和body。每种block都足以被一而再它的子模板重写或然封存它未来的暗中同意达成。该模板也能被一向渲染,只可是只是展现基础模板的定义内容。

      在config.yml空白区域布局fos_user告诉它用户类是orm类型的,防火墙的称呼是main,用户的类是user。那样访问的时候才明白选择正确的路子。

// app/AppKernel.php
class AppKernel extends Kernel {
public function registerBundles() {
$bundles = array(
// ..
new Blogger\BlogBundle\BloggerBlogBundle(),
);
// .. return $bundles; } // ..
}
}

注:{% extends
%}必须放在第贰行,当使用{% block body
%}时,body那个块中享有都被遮盖,若想保留用parent()函数例:

上边定义二个子模板:

    第⑤步:在routing.yml 添加FOSUserBundle路由文件

路由

{% block body %}

Twig格式:

      亚洲必赢官网 9

用作2个框架, 路由效能被bundler创造器创设于app/config/routing.yml,
symfony是用yml格式来保存配置新闻。

<h3>This is childContent</h3> …

{# src/Acme/BlogBundle/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 %}

      到次配置FOSUserBundle用户登陆验证算是旗开得胜。当然为了便利大家能够配备新的模版覆盖原来的。新模板的安排情势如下:

复制代码 代码如下:

{{ parent() }}

PHP代码格式:

      在app/Resources/下创办FOSUserBundle/views/layout.html.twig暗许文件。在layout.html.twig模板的同级目录创造

# app/config/routing.yml
BloggerBlogBundle:
resource: “@BloggerBlogBundle/Resources/config/routing.yml”
prefix: /

{% endblock %}

<!-- src/Acme/BlogBundle/Resources/views/Blog/index.html.php -->
<?php $view->extend('::base.html.php') ?>
<?php $view['slots']->set('title', 'My cool blog posts') ?>
<?php $view['slots']->start('body') ?>
  <?php foreach ($blog_entries as $entry): ?>
    <h2><?php echo $entry->getTitle() ?></h2>
    <p><?php echo $entry->getBody() ?></p>
  <?php endforeach; ?>
<?php $view['slots']->stop() ?>

      亚洲必赢官网 10

prefix前缀选项允许我们得以将其放置于如blog、news等子目录下。
文件
除开上述配置文件外, 其余超过51%文书生成为src目录下, 就好像抢先59%mvc框架。
在src下生成Blogger目录,
并有BlogBundle子目录存放着各个有关东东。区其他是类似于blogger的目录对应着php命名空间。

③ 、模版分歧命有名的模特式的囤积路径:

父模板被多少个特种的字符串语法表示 ::base.html.twig ,它表示该模板在项指标app/Resources/views 目录下。

      当然也可以直接从连串的vendor\friendsofsymfony\user-bundle\Resources\views下直接copy过去。

暗许控制器

AcmeBlogBundle::layout.html.twig:那些语法钦赐了三个AcmeBlogBundle的为主模板。因为中间部分“controller”被忽略了(如Blog),模板路径位于AcmeBlogBundle中的Resources/views/layout.html.twig

模板继承的首要字 {% extends %}标签。
该标签告诉模板化引擎首先评估父模板,它会设置布局和概念七个blocks。然后是子模板,上例中父模板中定义的title和body
七个blocks将会被子模板中的定义所替代。依靠blog_entries的值,输出的剧情如下:

      亚洲必赢官网 11

Bundle生成器在src下素不相识成了暗中同意了控制器。 通过拜访:
能够看到不难的问讯。
关于这几个页面是什么转变:

::base.html.twig:那个语法钦定了二个应用程序范围的沙盘或布局。注意该字符串由几个冒号(::)开端,意思是bundle和controller部分被忽视。那表示该模板没有放在任何Bundle之中,因而它应当放在app/Resources/views/目录中

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>My cool blog posts</title>
  </head>
  <body>
    <div id="sidebar">
      <ul>
        <li><a href="/">Home</a></li>
        <li><a href="/blog">Blog</a></li>
      </ul>
    </div>
    <div id="content">
      <h2>My first post</h2>
      <p>The body of the first post.</p>
      <h2>Another post</h2>
      <p>The body of the second post.</p>
    </div>
  </body>
</html>

      配置完结后方可一贯在域名后输入login、register进行登录注册。

路由

四 、模版包涵

在此大家注意到,因为子模板中并未定义sidebar这么些block,所以来自父模板的始末被彰显出来,而从不被子模板替代。位于父模板中的{%
block %}标签是暗中认可值,倘诺没有被子模板重写覆盖,它将用作默许值使用。

       实体配置方式上篇博客中早已说过,那里就不再提了。希望能够帮到须要的人。

恐怕路由, 不相同的是前方的路由是在整整程序里面注册使用,
那里的路由是决定具体页面使用,
src/Blogger/BlogBundle/Resources/config/routing.yml
控制了BloggerBlogBundle, 包涵以下顺序片断:

(1)3个模板文件中蕴藏别的的模版文件

您能够依照你的供给开始展览多层继承。
Symfony2项目中貌似选取一种三层继承格局来公司模板和页面。当我们使用模板继承时,须求专注:

      亚洲必赢官网 12

复制代码 代码如下:

{% include ‘AcmeArticleBundle:Article:articleDetails.html.twig’ with
{‘article’: article} %}

假定在模板中使用{% extends %},那么它必须是模板的率先个标签。

      天天都想写博客,但却不清楚写什么,有如何想要精通的,能够下评论区留言,作者抽时间写下。

# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_homepage:
pattern: /hello/{name}
defaults: { _controller: BloggerBlogBundle:Default:index }

就算with多个参数能够{‘foo’:foo, ‘bar’:bar}

你基础模板中{% block
%}越多越好,记住,子模板不必等一父模板中颇具的block。你父模板中block定义的更多,你的布局就越灵活。

       

参数: 进行url检查和测试, 符合/hello/{name}结构的任意值将被授予给{name},
方法: 没有对情势开始展览限定, 理论可以put, get, post,
delete全数的操作都足以拓展。
后续: 借使符合上述两条, 那么{name}将会传导至特定文件,
以上为src/Blogger/BlogBundle/Controller/DefaultController.php文件中的default控制器的index行为将被运用。

(2)八个模板文件包括其它八个控制器的结果

只要您发未来多少个模板中有双重的情节,那大概就代表你要求为该内容在父模板中定义一个{%
block
%}。有个别时候更好的缓解方案大概是把这么些情节放到2个新模板中,然后在该模板中include它。

 

控制器

{% render “AcmeArticleBundle:Article:recentArticles” with {‘max’: 3} %}

万一你须要从父模板中收获叁个block的始末,你能够接纳{{ parent() }}函数。

 

在暗许生产的bundler中, 控制器行为一定不难,
{name}参数被盛传并被传播到模板文件:

注:两者分别在于include是将参数article传给了articleDetails.html.twig中的article参数,而render是将max参数传给了recntArticle这一个控制器

{% block sidebar %}
  <h3>Table of Contents</h3>
  ...
  {{ parent() }}
{% endblock %}

 

// src/Blogger/BlogBundle/Controller/DefaultController.php
namespace Blogger\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction($name)
{
return $this->render('BloggerBlogBundle:Default:index.html.twig', array('name' => $name));
}
}

伍 、其余救助函数

模板的命名和仓库储存地点

 

BloggerBlogBundle:Default:index.html.twig 会使用 BloggerBlogBundle
views文件夹中 Default文件夹上面index.html.twig模板文件.

(1)根据路由名生成url链接:

暗许处境下,模板能够被保留到三个职务:

 

模板文件

浮动相对路径:<a href=”{{ path(‘article_show’, { ‘slug’:
article.slug }) }}”>

app/Resources/views
目录下,能够存放整个应用程序级的根底模板以及那多少个重写bundle模板的模版。

 

开拓上述模板文件, 十分简单的一句代码:

转移相对路劲:<a
href=”{{ url(‘homepage’) }}”>Home</a>

path/to/bundle/Resources/views
目录下,各个bundle本身的模版。

 

{# src/Blogger/BlogBundle/Resources/views/Default/index.html.twig #}
Hello {{ name }}!

在php模版中用<a href=”<?php echo
$view[‘router’]->generate(‘homepage’, array(), true)
?>”>Home</a>(symony第11中学是采纳url_for)

Symfony2使用bundle:controller:template
字符串语法表示模板。那足以代表许多不比类型的模板,每一种都存放在特定的路径下:
AcmeBlogBundle:Blog:index.html.twig 用于钦赐三个特定页面包车型地铁沙盘。
AcmeBlogBundle
代表bundle,表明模板位于AcmeBlogBundle,比如src/Acme/BlogBundle。
Blog
表示BlogController,钦赐模板位于Resourcs/views的Blog子目录中,index.html.twig为模板名字。

 

以上就是symfony的全部mvc流程, 这么多文件的作用只是出口2个 “hello
world”. 理论上不要bundler创制器,
只是手动创造上述文件也得以兑现均等效果。耗费的小运就多了去了。

(2)连接向css、js、iamge等资源:

固然AcmeBlogBundle位于src/Acme/BlogBundle,
最后的途径将是:src/Acme/BlogBundle/Resources/views/Blog/index.html.twig

    

重临正题, 大家是开创博客系统, 所以不须要 hello world,

<img src=\’#\'” asset(‘images/logo.png’) }}” alt=”Symfony!” />

AcmeBlogBundle::layout.html.twig
该表示法指向AcmeBlogBundle的基模板。没有controller部分,所以模板应该放在AcmeBlogBundle的Resources/views/layout.html.twig

 

1.移除控制器 src/Blogger/BlogBundle/Controller/DefaultController.php
2.移除模板 src/Blogger/BlogBundle/Resources/views/Default/
3.终极移除路由 src/Blogger/BlogBundle/Resources/config/routing.yml
凡事社会风气寂静了。

<link href=”{{ asset(‘css/blog.css’) }}” rel=”stylesheet”
type=”text/css” />

::base.html.twig
表示二个行使程序级的基模板恐怕布局文件。注意,该语句八个冒号开头,意味着没有bundle和controller部分,那评释该公文不在某些bundle中,而是放在根目录下
app/Resources/views

③ 、让大家早先成立博客的主页

引:asset函数的重点目标是将你的应用程序更易于移植。若是您的应用程序在您主机的根目录下(如:

在重写Bundle模板一节,你将发现放在AcmeBlogBundle的模板是何许被放在app/Resources/AcmeBlogBundle/views/目录下的装有模板同名重写的,
那种方法给了大家3个精锐的路子来重写供应商提供的bundle的模板。

Twig的优点

(3)配置和应用模版引擎:

模板后缀(suffix)

在symfony中大家得以行使
Twig和php(那不是废话嘛)作为模板。使用Twig的以下优点:

布局和应用模板服务

bundle:controller:template
句法表达了各类模板文件的寄放地方。每种模板名字也有七个扩充名来钦命格式和模板引擎。
AcmeBlogBundle:Blog:index.html.twig HTML格式,Twig引擎
AcmeBlogBundle:Blog:index.html.php HTML格式,PHP引擎
AcmeBlogBundle:Blog:index.css.twig CSS格式,Twig引擎
私下认可意况下,Symfony2的别样模板都得以被写成Twig或许PHP引擎的,它由后缀决定。当中后缀的前一部分(.html,.css)表示最终生成的格式。

  1. 快: 是编绎过的php类, 能够占据更少的能源

  2. 简短:想想看要打<?php ?>, Twig输入的情节要少很多。

  3. 可继续: 10分cool的八个效用

  4. 安全: 转义作用默许开启, 甚至还足以为主要代码提供沙盒作用。

  5. 可扩展: 须求相当的定制效率, 能够天天扩大

在Symfony2中模板系统的基本是模板引擎。那么些一定的目的承担渲染模板并回到它的始末。当您在控制器中渲染三个模板时,举个例子,你实在是在行使模板引擎服务。如:

标签和帮手类

更加多内容, 请移步:

return $this->render(‘AcmeArticleBundle:Article:index.html.twig’);

您曾经基本通晓了模版,它们如何命名怎么样运用模板继承等。最难掌握的一些已经过去。接下来大家将通晓大量的可用工具来帮忙大家进行最通用的模版职分比如含有其余3个模板,链接贰个页面或然隐含三个图片等。

可继承是1个拾贰分好的长处, 我们将采取三级继承结构来定制那些模板,
那将同意我们在三个例外层级修改模板, 方便轻易定制。

等同于

Symfony2中包括了血多系列化的Twig标签和效能函数来扶持设计者更易于的做到工作。在PHP中,模板系统提供了一个可扩充的helper系统,它能够在模板上下文中提供成千成万管用的剧情。我们曾经看过一些内建的Twig标签,比如{%
block %}{% extends %}等,还有PHP 助手$view[‘slots’]。

主模板–level 1

$engine = $this->container->get(‘templating’); $content =
$engine->render(‘AcmeArticleBundle:Article:index.html.twig’); return
$response = new Response($content);

涵盖其余模板:

<!– app/Resources/views/base.html.twig –>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset=utf-8" />
<title>{% block title %}symfony{% endblock %} – blog</title>
<!–[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]–>
{% block stylesheets %}
<link href='http://fonts.googleapis.com/css?family=Irish+Grover' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=La+Belle+Aurore' rel='stylesheet' type='text/css'>
<link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}
<link rel="shortcut icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
<section id="wrapper">
<header id="header">
<div>
{% block navigation %}
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
{% endblock %}
</div>
<hgroup>
<h2>{% block blog_title %}<a href="#">symfony</a>{% endblock %}</h2>
<h3>{% block blog_tagline %}<a href="#">creating a blog in Symfony2</a>{% endblock %}</h3>
</hgroup>
</header>
<section>
{% block body %}{% endblock %}
</section>
<aside>
{% block sidebar %}{% endblock %}
</aside>
<div id="footer">
{% block footer %}
<a href="http://blog.dengruo.com/201309/1409">Symfony2 博客教程</a>
{% endblock %}
</div>
</section>
{% block javascripts %}{% endblock %}
</body>
</html>

模板引擎(或“服务”)被预配置成在Symfony第22中学自行工作。当然它能够在应用程序配置文件中布局。

你或者时时想在三个例外的页面中带有同一个模板或许代码片段。比如叁个应用程序中有”新闻小说”,模板代码在浮现一片文章时或然用到作品详细页面,一个具体最流行作品的页面,或然二个流行篇章的列表页面等。

上面代码在引入了2个js文件, 在ie9版本前的浏览器中贯彻html,
以及七个css文件导入google fronts.
这构成了网页的严重性内容结构, 相当于drupal的html.tpl.php+page.tpl.php.
让大家看一下尾部文件

# app/config/config.yml framework: # … templating: { engines:
[‘twig’] }

当您供给引用一些PHP代码,你通常都以把这个代码放到一个PHP类或许函数中。同样在模板中你也能够这样做。通过把可选取的代码放到2个它本身的模版中,然后把这些模板包含到其余模板中。比如我们创设七个可采用模板如下:

复制代码 代码如下:

6、模版复写

Twig格式:

<title>{% block title %}blog{% endblock %} – symfony</title>

Symfony2总是先物色位于app/Resources/BUNDLE_NAME/views/目录的模版。如若该模板不存在,它将持续在Bundle自个儿之中的Resources/views目录中搜寻。所以能够将模版文件写在app/Resources/BUNDLE_NAME/views/目录下来覆盖Bundle自个儿内部的Resources/views目录下的模版文件。

{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}
<h2>{{ article.title }}</h2>
<h3 class="byline">by {{ article.authorName }}</h3>
<p>
  {{ article.body }}
</p>

{% 标签中即不是html, 也不是php, 他是贰个Twig标签中的一个,
用于执行某个动作。 那里能够找到完整的Twig控制动作效果率于那么些标签。
回到当前代码, 是用于查找title的block并出口他,
倘若没有则输出暗中同意的symblo那几个词。
Twig的可续承本性可以用于修改title, 大家能够在其余模板文件中重写它:

因为Symfony2框架自个儿也是贰个Bundle,宗旨模板也得以用同样的艺术覆写。举个例子,大旨的FrameworkBundle包罗着多量的“分外”和“错误”模板。要覆写它们,能够将它们从FrameworkBundle的Resources/views/Exception目录中拷贝到,正如您所想,app/Resources/FrameworkBundle/views/Exception目录中。(这一个比较实用)

PHP代码格式:

{% extends ‘::base.html.twig’ %}
{% block title %}The blog title goes here{% endblock %}

 

<!-- src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.php -->
<h2><?php echo $article->getTitle() ?></h2>
<h3 class="byline">by <?php echo $article->getAuthorName() ?></h3>
<p>
  <?php echo $article->getBody() ?>
</p>

地点代码首先继承了第②遍定义那几个block的文件, 然后修改它。
网站标题部分会输出 ‘The blog title goes here – symfony’。
貌似而言, 大家引用模板文件时会采取bundle:controller:template,
不过以上代码并不曾bundle 和controller,
不分包那多少个字段会直接引用app/Resources/views/ 文件夹下边包车型大巴文书。

⑦ 、输出转义

接下来我们把它包蕴到别的模板定义中:

在css样式表中, 我们得以窥见另一个Twig标签{{,
那是二个输出(说些什么)标签。

为了防止XSS攻击要求转义输出,在symfony2
Twig模版引擎中输出转义是默许开启的,php模版引擎不开启

Twig格式:

复制代码 代码如下:

在好几案例中,当正在渲染一个被信任变量和无法被清理的标识时,你必要废除输出清理。要是管理用户能够写包涵HTML代码的小说。缺省状态下,Twig将清理小说内容。要健康地渲染它,添加raw过滤器:{{
article.body | raw }}。

{# src/Acme/ArticleBundle/Resources/Article/list.html.twig #}
{% extends 'AcmeArticleBundle::layout.html.twig' %}
{% block body %}
  <h1>Recent Articles<h1>
  {% for article in articles %}
    {% include 'AcmeArticleBundle:Article:articleDetails.html.twig' with {'article': article} %}
  {% endfor %}
{% endblock %}

<link href=”{{ asset(‘css/screen.css’) }}” type=”text/css”
rel=”stylesheet” />

 

PHP代码格式:

其一标签用于出口变量或许表明式, 下面例子输出了asset函数的重回值,
那一个函数提供可移植的章程来回到css,js, 图片的地方。

为了创立包罗格式参数的链接,在参数的哈希数组中包涵_format关键词:

<!-- src/Acme/ArticleBundle/Resources/Article/list.html.php -->
<?php $view->extend('AcmeArticleBundle::layout.html.php') ?>
<?php $view['slots']->start('body') ?>
  <h1>Recent Articles</h1>
  <?php foreach ($articles as $article): ?>
    <?php echo $view->render('AcmeArticleBundle:Article:articleDetails.html.php', array('article' => $article)) ?>
  <?php endforeach; ?>
<?php $view['slots']->stop() ?>

以此标签能够以一定格式输出大家想要内容, 比如时间:

<a href=”{{ path(‘article_show’, {‘id’: 123, ‘_format’: ‘pdf’})
}}”>This is PDF</a> 

模板的涵盖使用{% include
%}标签。模板的称号要动用通用方式。在articleDetails.html.twig模板中利用article变量,那里透过在list.html.twig模板中采取with命令传入。{‘article’:article}语法是正统Twig哈希映射的写法。假设大家要求传递八个要素,能够写成{‘foo’:
foo, ‘bar’: bar}。

复制代码 代码如下:

嵌入Controllers

{{ blog.created|date(“d-m-Y”) }}

稍加情状下,你要求比包含简单模板做到更加多。即使你有二个菜谱栏sidebar在您的布局文件中来彰显最新的稿子。获取三篇最新篇章大概必要查询数据库只怕实行此外富含众多逻辑的操作,那样就不能够在多个模板中展开了。那种气象的消除方案是简答键入3个完好的controller到您的沙盘。首先创设2个controller来渲染特定数量的近年小说:

漫天过滤列表在 Twig 文书档案能够查到。

//src/Acme/ArticleBundle/Controller/ArticleController.php
class ArticleController extends Controller
{
   public function recentArticlesAction($max = 3)
   {
      //生成一个数据库调用或者其它逻辑来获取$max个最新文章的代码
      $articles = ...;
      return $this->render('AcmeArticleBundle:Article:recentList.html.twig',array('articles'=>articles));
   }
}

最后一个标签并不曾在上述代码中现身, 它是{#, 只是一个声明标签

而recentList模板则一定简单:

复制代码 代码如下:

Twig格式:

{# 注释内容能够出口在那边 #}

{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}
{% for article in articles %}
   <a href="/article/{{ article.slug }}">
      {{ article.title }}
   </a>
{% endfor %}

接下去大家将开创css样式表web/css/screen.css , 参加以下内容.

PHP代码格式:

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}
body { line-height: 1;font-family: Arial, Helvetica, sans-serif;font-size: 12px; width: 100%; height: 100%; color: #000; font-size: 14px; }
.clear { clear: both; }
#wrapper { margin: 10px auto; width: 1000px; }
#wrapper a { text-decoration: none; color: #F48A00; }
#wrapper span.highlight { color: #F48A00; }
#header { border-bottom: 1px solid #ccc; margin-bottom: 20px; }
#header .top { border-bottom: 1px solid #ccc; margin-bottom: 10px; }
#header ul.navigation { list-style: none; text-align: right; }
#header .navigation li { display: inline }
#header .navigation li a { display: inline-block; padding: 10px 15px; border-left: 1px solid #ccc; }
#header h2 { font-family: 'Irish Grover', cursive; font-size: 92px; text-align: center; line-height: 110px; }
#header h2 a { color: #000; }
#header h3 { text-align: center; font-family: 'La Belle Aurore', cursive; font-size: 24px; margin-bottom: 20px; font-weight: normal; }
.main-col { width: 700px; display: inline-block; float: left; border-right: 1px solid #ccc; padding: 20px; margin-bottom: 20px; }
.sidebar { width: 239px; padding: 10px; display: inline-block; }
.main-col a { color: #F48A00; }
.main-col h1,
.main-col h2
{ line-height: 1.2em; font-size: 32px; margin-bottom: 10px; font-weight: normal; color: #F48A00; }
.main-col p { line-height: 1.5em; margin-bottom: 20px; }
#footer { border-top: 1px solid #ccc; clear: both; text-align: center; padding: 10px; color: #aaa; }
<!-- src/Acme/ArticleBundle/Resources/views/Article/recentList.html.php -->
<?php foreach ($articles as $article): ?>
  <a href="/article/<?php echo $article->getSlug() ?>">
    <?php echo $article->getTitle() ?>
  </a>
<?php endforeach; ?>

Bundler模板–level 2

为了能包涵controller,你供给接纳三个专业的字符语法来代表controller,格式类似bundle:controller:action

前几天大家为blog bundler 创造模板,
成立src/Blogger/BlogBundle/Resources/views/layout.html.twig 并参与:

Twig格式:

复制代码 代码如下:

{# app/Resources/views/base.html.twig #}
...
<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

{# src/Blogger/BlogBundle/Resources/views/layout.html.twig #}
{% extends ‘::base.html.twig’ %}
{% block sidebar %}
Sidebar content
{% endblock %}

PHP代码格式:

非凡简单的代码,1. 连任了拔尖模板, 并且为博客内容尤其定制了侧边栏,
很强烈我们并不想博客的布局与其它页面一样。
类似drupal7中page–content-type.tpl.php模板,
定制了某一特有种类内容的布局。

<!-- app/Resources/views/base.html.php -->
...
<div id="sidebar">
  <?php echo $view['actions']->render('AcmeArticleBundle:Article:recentArticles', array('max' => 3)) ?>
</div>

具体页面布局–level 3

不论是什么样时候,你须要叁个变量可能局部列新闻时,你不要在模板中访问,而是考虑渲染二个controller。因为Controller能够更快的施行并且很好的增加了代码的团伙和起用。

本条阶段已经涉及到创制具体页面,
所以需求先创建控制器src/Blogger/BlogBundle/Controller/PageController.php

链接到页面:

// src/Blogger/BlogBundle/Controller/PageController.php
namespace Blogger\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class PageController extends Controller
{
public function indexAction()
{
return $this->render('BloggerBlogBundle:Page:index.html.twig');
}
}

在您的应用程序中开创多少个链接到其余页面对于二个模板来说是再日常不过的事体了。大家利用path
Twig函数基于路由配置来生成URL而非在模板中硬编码U冠道L。今后借使你想修改二个特定页面包车型大巴U本田UR-VL,你只须求转移路由布置即可,模板将自动生成新的U中华VL。比如我们打算链接到”_welcome”页面,首先定义其路由安插:

下一场创制相应的Twig文件:
src/Blogger/BlogBundle/Resources/views/Page/index.html.twig

YAML格式:

复制代码 代码如下:

_welcome:
  pattern: /
  defaults: { _controller: AcmeDemoBundle:Welcome:index }

{# src/Blogger/BlogBundle/Resources/views/Page/index.html.twig #}
{% extends ‘BloggerBlogBundle::layout.html.twig’ %}
{% block body %}
Blog homepage
{% endblock %}

XML格式:

创立路由将首页指点到大家刚创设的页面:src/Blogger/BlogBundle/Resources/config/routing.yml

<route id="_welcome" pattern="/">
  <default key="_controller">AcmeDemoBundle:Welcome:index</default>
</route>

复制代码 代码如下:

PHP代码格式:

# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_homepage:
pattern: /
defaults: { _controller: BloggerBlogBundle:Page:index }
requirements:
_method: GET

$collection = new RouteCollection();
$collection->add('_welcome', new Route('/', array(
  '_controller' => 'AcmeDemoBundle:Welcome:index',
)));
return $collection;

重新做客

大家得以在模板中央银行使Twig函数 path来引用这一个路由链接该页面。

亚洲必赢官网 13

Twig格式:

肆 、再制造二个about页面

<a href="{{ path('_welcome') }}">Home</a>

路由:在src/Blogger/BlogBundle/Resources/config/routing.yml中加入

PHP代码格式:

复制代码 代码如下:

<a href="<?php echo $view['router']->generate('_welcome') ?>">Home</a>

# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_about:
pattern:  /about
defaults: { _controller: BloggerBlogBundle:Page:about }
requirements:
_method:  GET

地点的剧情会变动1个ULacrosseL /

当以get方式访问about页时进行位于BloggerBlogBundle命名空间的page控制器about动作。

咱俩看另2个错综复杂一些的路由定义:

控制器: 在src/Blogger/BlogBundle/Controller/PageController.php
于page控制器中投入about动作

YAML格式:

复制代码 代码如下:

article_show:
  pattern: /article/{slug}
  defaults: { _controller: AcmeArticleBundle:Article:show }

// src/Blogger/BlogBundle/Controller/PageController.php
// ..
public function aboutAction()
{
return $this->render(‘BloggerBlogBundle:Page:about.html.twig’);
}
// ..

XML格式:

模板: 成立src/Blogger/BlogBundle/Resources/views/Page/about.html.twig
并投入相关页面文件

<route id="article_show" pattern="/article/{slug}">
  <default key="_controller">AcmeArticleBundle:Article:show</default>
</route>

复制代码 代码如下:

PHP代码格式:

{# src/Blogger/BlogBundle/Resources/views/Page/about.html.twig #}
{% extends ‘BloggerBlogBundle::layout.html.twig’ %}
{% block body %}
about page
{% endblock %}

$collection = new RouteCollection();
$collection->add('article_show', new Route('/article/{slug}', array(
  '_controller' => 'AcmeArticleBundle:Article:show',
)));
return $collection;

归纳的多少个流程增添了有关页面:

那种状态下您供给钦定路由名称(article_show)还要三个参数值{slug}。现在让咱们再来看上边的recentList模板
,大家修改以前的硬编码而利用path来链接正确的稿子。

希望本文所述对我们基于Symfony框架的PHP程序设计具有扶助。

Twig格式:

您或者感兴趣的稿子:

  • Symfony查询艺术实例小结
  • Symfony2联合查询完成方式
  • Symfony2使用Doctrine举办数据库查询办法实例计算
  • 高品质PHP框架Symfony2经典入门教程
  • Symfony2完成从数据库获取数据的办法小结
  • Symfony2学习笔记之模板用法详解
  • Symfony2框架学习笔记之表单用法详解
  • symfony2.4的twig中date用法分析
  • Symfony2学习笔记之控制器用法详解
  • Symfony2安装第贰方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间展开询问的主意分析
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}
{% for article in articles %}
  <a href="{{ path('article_show', { 'slug': article.slug }) }}">
    {{ article.title }}
  </a>
{% endfor %}

PHP代码格式:

<!-- src/Acme/ArticleBundle/Resources/views/Article/recentList.html.php -->
<?php foreach ($articles in $article): ?>
  <a href="<?php echo $view['router']->generate('article_show', array('slug' => $article->getSlug()) ?>">
    <?php echo $article->getTitle() ?>
  </a>
<?php endforeach; ?>

您也能够因此url Twig函数来生成3个相对路径的U奇骏L:

<a href="{{ url('_welcome') }}">Home</a>

在PHP代码模板中,你须要给generate()方法传入第多个参数true
来贯彻生成绝对路径USportageL

<a href="<?php echo $view['router']->generate('_welcome', array(), true) ?>">Home</a>

链接到财富

模板日常也亟需有个别图纸,Javascript,样式文件和其它国资本产。当然你能够硬编码它们的不二法门。比如/images/logo.png。
不过Symfony2 提供了二个尤其动态的Twig函数 asset()。

Twig格式:

<img src="{{ asset('images/logo.png') }}" alt="Symfony!" />
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" type="text/css" />

PHP代码格式:

<img src="<?php echo $view['assets']->getUrl('images/logo.png') ?>" alt="Symfony!" />
<link href="<?php echo $view['assets']->getUrl('css/blog.css') ?>" rel="stylesheet" type="text/css" />

asset函数的首要墨笔是让你的应用程序尤其方便。假使您的应用程序在您的主机根目录下(比如:
/images/logo.png
。然则如若您的应用程序位于一个子目录中(比如:
/my_app/images/logo.png
。asset函数能够依据你的应用程序来生成正确的不二法门。

除此以外,假设您采纳asset函数,symfony能够自动追加三个查询字符串到你的开销,以保障被更新的静态财富不会在安插时被缓存。比如:/images/logo.png
只怕看起来是 /images/logo.png?v2 。

含有样式表和Javascript文件到Twig模板:

各类网站中都十分的小概不够了样式表和javascript文件。在Symfony中,那几个内容能够透过沙盘继承很好的举行包括处理。Symfony打包了别的二个类库叫做Assetic,
它同意你对那么些能源做更加多的幽默操作。首先在你的基模板中添加多个blocks来保存你的财富,一个叫stylesheets,放在head标签里,另叁个叫javascript,放在body停止标签上边一行。那几个blocks将富含你整整站点所要求的兼具stylesheets和javascripts。

{# 'app/Resources/views/base.html.twig' #}
<html>
  <head>
    {# ... #}
    {% block stylesheets %}
      <link href="{{ asset('/css/main.css') }}" type="text/css" rel="stylesheet" />
    {% endblock %}
  </head>
  <body>
    {# ... #}
    {% block javascripts %}
      <script src="{{ asset('/js/main.js') }}" type="text/javascript"></script>
    {% endblock %}
  </body>
</html>

那太不难了!但如若你想从子模板中含有一个非凡的stylesheet恐怕javascript如何是好吧?比如借使你有1个联络页面需求包涵四个contact.css样式表只用于该页面。在您的contact页面模板内部,你能够这么完毕:

{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}
{% extends '::base.html.twig' %}
{% block stylesheets %}
  {{ parent() }}
  <link href="{{ asset('/css/contact.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}
{# ... #}

在子模板中您只需求重写stylesheets
block并把你新的样式表标签放到该块里。当然因为您想添加到父模板该块内容中,而不是代表它们所以你供给以前

先选取parent()函数来取得父模板中的全数stylesheets。你也足以包涵能源职分到你的bundle的Resources/public
文件夹。你需求实践如下命令行:

$php app/console assets:install target [--symlink]

它会把文件移动到科学的位置,私下认可景况下的对象地点是web文件夹。

<link href="{{ asset('bundles/acmedemo/css/contact.css') }}" 
type="text/css" rel="stylesheet" />

地点代码最后结出是页面会蕴含main.css和contact.css样式表。

全局模板变量

在每一个请求中,Symfony2
将会在Twig引擎和PHP引擎暗许设置三个大局模板变量app。该app变量是贰个GlobalVariables实例,它将让你活动访问到应用程序一些一定可以的变量。比如:

app.security 安全上下文
app.user 当前用户对象
app.request 当前Request对象
app.session Session对象
app.environment 当前应用程序的环境(dev,prod等)
app.debug 假若是true表明是调节和测试格局,false则不是。

本来,你也足以向其添加你自个儿的大局模板变量。其使用示范:

Twig格式:

<p>Username: {{ app.user.username }}</p>
{% if app.debug %}
  <p>Request method: {{ app.request.method }}</p>
  <p>Application Environment: {{ app.environment }}</p>
{% endif %}

PHP代码格式:

<p>Username: <?php echo $app->getUser()->getUsername() ?></p>
<?php if ($app->getDebug()): ?>
  <p>Request method: <?php echo $app->getRequest()->getMethod() ?></p>
  <p>Application Environment: <?php echo $app->getEnvironment() ?></p>
<?php endif; ?>

配置和选择templating 服务

Symfony2模板系统的骨干是模板化引擎。这么些卓绝的靶子承担渲染模板并重返他们科学的剧情。当你在controller中渲染八个模板时,其实您是选用了模板化引擎服务,比如:

return $this->render('AcmeArticleBundle:Article:index.html.twig');

骨子里一定于:

$engine = $this->container->get('templating'); 
$content = $engine->render('AcmeArticleBundle:Article:index.html.twig');
return $response = new Response($content);

该模板化引擎服务在Symfony2内部是先期布署好活动工作的。当然它也能够在应用程序的安顿文件中开始展览布局。比如:

YAML格式:

# app/config/config.yml
framework:
  # ...
  templating: { engines: ['twig'] }

XML格式:

<!-- app/config/config.xml -->
<framework:templating>
  <framework:engine id="twig" />
</framework:templating>

PHP代码格式:

// app/config/config.php
$container->loadFromExtension('framework', array(
  // ...
  'templating'   => array(
    'engines' => array('twig'),
  ),
));

重写Bundle模板:

Symfony2社会群众体育今后正为他们创建和保安了举不胜举两样内容的高质量的Bundle而感到骄傲,一旦你选用第②方的bundle你或然想重写只怕本性化它们的一个可能八个模板。假使你早就包罗了开源AcmeBlogBundle到您的品类中,比如目录是src/Acme/BlogBundle,你想重写blog列表(list)页面来遵照你自个儿的应用程序风格天性化它。大家开拓AcmeBlogBundle的Blog
controller,能够窥见如下内容:

public function indexAction()
{
  $blogs = // some logic to retrieve the blogs
  $this->render('AcmeBlogBundle:Blog:index.html.twig', array('blogs' => $blogs));
}

当AcmeBlogBundle:Blog:index.html.twig被渲染时,Symfony2
会查找八个职位来定位模板:

  1. app/Resources/AcmeBlogBundle/views/Blog/index.html.twig
  2. src/Acme/BlogBundle/Resources/views/Blog/index.html.twig

要重写该bundle的模版,仅仅从bundle中拷贝index.html.twig
模板到app/Resources/AcmeBlogBundle/views/Blog/index.html.twig。

只顾,假诺app/Resources/AcmeBlogBundle目录不设有,能够手工业建立。之后你就能够肆意的个性化处理该模板了。

该逻辑同样适用于基bundle模板,若是AcmeBlogBundle中各样模板都是继续于基模板AcmeBlogBundle::layout.html.twig。Symfony2
将从下面八个地点寻找模板:

1.app/Resources/AcmeBlogBundle/vews/layout.html.twig

2.src/Acme/BlogBundle/Resources/views/layout.html.twig

一如既往的,假如要重写该模板,你唯有须要从bundle中拷贝到app/Resources/AcmeBlogBundle/views/layout.html.twig
就足以轻松本性化它了。你也足以透过bundle继承来从bundle内部重写模版。

重写宗旨模板:

因为Symfony2
框架自己便是2个bundle,所以其基本模板也得以依照同样的艺术展开重写。比如,宗旨模板TwigBundle包涵众多不等”execption”和”error”
的沙盘,你能够经过从Resources/views/Exception
目录下每一项到app/Resources/TwigBundle/Views/Exception 目录下 。

三级继承:

Symfony第22中学一般选拔三级继承来成功臣模范板创立。它采纳几种不一样品种的模版:
先是,创造二个app/Resources/views/base.html.twig
文件,它富含你应用程序主要的布局,该模板被调用时写成
::base.html.twig。
接下来,为您站点的每一个部分section创建1个模板。比如贰个AcmeBlogBundle,
它有友好的贰个模板AcmeBlogBundle::layout.html.twig。该模板只含有特定的成分,比如body。

{# src/Acme/BlogBundle/Resources/views/layout.html.twig #}
{% extends '::base.html.twig' %}
{% block body %}
  <h1>Blog Application</h1>
  {% block content %}{% endblock %}
{% endblock %}

末段,是为种种页面成立贰个独自的模板并继续合适的section模板。比如,为index页创造的模版
AcmeBlogBundle:Blog:index.html.twig 用来列出富有的blog。

{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}
{% extends 'AcmeBlogBundle::layout.html.twig' %}
{% block content %}
  {% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
  {% endfor %}
{% endblock %}

专注该模板是继续了section模板(AcmeBlogBundle:layout.html.twig),而section模板又连续了使用程序基模板(::base.html.twig)。那就是见惯司空说的三级继承形式。

在你创建你的应用程序时,你能够选择这种形式,也足以为各类页面创造模板时直接接轨应用程序的基模板(比如:
{% extends ‘::base.html.twig’ %} 。

三模板格局对于四个bundle开发商来说是最好的格局,因为如此bundle使用者能够很不难的重写bundle的基模板来适合自身应用程序的着力布局。

安全出口转换:

当咱们从沙盘中生成HTML时,总会有高风险存在,比如有的模板变量或许输出一些奇怪的HTML或许危险的客户端代码。结果那个动态内容会打破结果页面包车型大巴HTML恐怕允许部分黑心的访问者执行一些页面攻击。举个例子:

Twig格式:

Hello {{ name }}

PHP代码格式:

Hello <?php echo $name ?>

想像一下用户输入上面的代码作为她们的name时,结果会是哪些?

<script>alert('hello!')</script>

从没其余的输出安全转义,结果模板会触发JavaScript弹出框:

Hello <script>alert('hello!')</script>

亚洲必赢官网 ,那种景观看上去,没多大害处,借使三个用户知道这一步,它完全有力量写3个javascript在大家不解的保山区域来推行一些黑心行为。这一个题指标消除办法是出口安全转义。
假设添加了出口安全转义,同样的模版会渲染出无毒的内容,script标签会作为一般文书输出到显示屏上。

Hello <script>alert('helloe')</script>

PHP和Twig模板化系统应用了不一致的措施来化解那个难题。假诺你采纳Twig,暗许情形下是出口安全转义的,你的输出是遭逢保卫安全的。借使是PHP,则输出安全转义不是机动的,需求你手工业的进展拍卖。

Twig中的安全出口

一旦你选用Twig模板,那么输出安全是暗中认可的。你不要求对用户提交的输出内容开展手动珍视。在一些情形下,你需求关闭输出安全有限帮助,当你渲染有个别可靠变量恐怕隐含有些标签时。如若管理员用户能够编写一些代码有HTML标签的稿子。暗中同意意况下,Twig将转义小说体。为了渲染正常,要求加上二个raw
过滤器:

{{article.body | raw }}

你也足以在{% block %}区域如故全部模板中关闭安全珍贵。

PHP中的安全出口保卫安全:

在PHP中安全出口保卫安全不是自行实现的,这就意味着只有您出示的挑选来对有个别输出变量实行爱惜,不然输出都以不安全的。我们应用view的方法escape()来对输出变量进行安全出口保卫安全:

Hello <?php echo $view->escape($name) ?>

暗中认可情形下,escape()方法暗许景况下要是变量是被渲染在1个HTML上下文中的。也便是说只针对HTML安全。
它的第二个参数让您可见转移它针对的上下文。

譬如须求在javascript上下文中输出某个事物,就是用 js 上下文。

var myMsg = 'Hello <?php echo $view->escape($name, 'js') ?>';

模板调节和测试

当使用php代码时,大家得以运用var_dump()来非常的慢的查看1个值的变量传递。同样在Twig中,大家能够使用debug扩大来实现同等的成效,只是须求事先在安顿文件中开启。

YAML 格式:

# app/config/config.yml
services:
  acme_hello.twig.extension.debug:
    class:    Twig_Extension_Debug
    tags:
       - { name: 'twig.extension' }

XML格式:

<!-- app/config/config.xml -->
<services>
  <service id="acme_hello.twig.extension.debug" class="Twig_Extension_Debug">
    <tag name="twig.extension" />
  </service>
</services>

PHP代码格式:

// app/config/config.php
use Symfony\Component\DependencyInjection\Definition;
$definition = new Definition('Twig_Extension_Debug');
$definition->addTag('twig.extension');
$container->setDefinition('acme_hello.twig.extension.debug', $definition);

那时,我们就足以选用dump函数来查看模板参数了:

{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}
{{ dump(articles) }}
{% for article in articles %}
  <a href="/article/{{ article.slug }}">
    {{ article.title }}
  </a>
{% endfor %}

模板格式:

模板是一个渲染任何格式内容的通用的点子。大部分景况下,大家选取模板来渲染HTML内容。模板同样也能渲染想javascript,CSS,XML以及你能想象到的任何格式内容。比如,同一个能源resource平常被渲染为差别的格式。把小说目录页渲染为XML,你须要在模板的名号中蕴涵相应的格式即可。

XML 模板名: AcmeArticleBundle:Article:index.xml.twig
XML 模板文件名:index.xml.twig

实际上,那里只是命名上有了转变,而模板并从未真的的基于分裂的格式渲染分歧。在半数以上景况下,你或者想让单一的controller依照请求的格式差别渲染七个例外的格式。上边是3个家常的写法:

public function indexAction()
{
  $format = $this->getRequest()->getRequestFormat();
  return $this->render('AcmeBlogBundle:Blog:index.'.$format.'.twig');
}

Request对象的getRequestFormat()方法暗许再次回到值为html,
request的格式平日是在路由时间控制制的。比如/contact 设置的请求格式是html,而
/contact.xml 设置的乞求格式则是
XML。创造1个包括呼吁格式的链接,只须要在参数哈希表中蕴藏
_format键值即可。

Twig格式:

<a href="{{ path('article_show', {'id': 123, '_format': 'pdf'}) }}">
  PDF Version
</a>

PHP代码格式:

<a href="<?php echo $view['router']->generate('article_show', array('id' => 123, '_format' => 'pdf')) ?>">
  PDF Version
</a>

小结思考:

Symfony第22中学的模板引擎是贰个有力的工具,你能够用它来依照须要扭转包涵HTML,XML以及任何任何格式的剧情。尽管模板时controller生成内容的平凡方式,不过不是必须的。controller重临的Response对象足以利用模板也得以没有模板。

// 使用模板生成Response对象
$response = $this->render('AcmeArticleBundle:Article:index.html.twig');
// 使用简单文本内容生成Response对象
$response = new Response('response content');

Symfony2的模板引起非诚灵活,暗中认可意况下帮衬守旧的PHP模板和灵活性强大的Twig模板,他们都具备万分丰裕的鼎力相助函数来推行一些常见职责,Symfony2推荐应用Twig模板,因为它越是从简,高效,能更好的拍卖继承等。

梦想本文所述对大家基于Symfony框架的PHP程序设计有所扶助。

你可能感兴趣的篇章:

  • Symfony查询办法实例小结
  • Symfony2联合查询完毕格局
  • Symfony2使用Doctrine举办数据库查询情势实例计算
  • 高性能PHP框架Symfony2经典入门教程
  • Symfony2完成从数据库获取数据的形式小结
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2框架创立项目与模板设置实例详解
  • symfony2.4的twig中date用法分析
  • Symfony2学习笔记之控制器用法详解
  • Symfony2安装第②方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间开展查询的办法分析
网站地图xml地图