Symfony2框架创立项目与模板设置实例详解,Symfony2模版引擎使用验证手册

    symfony是2个由组件构成的框架,登录验证的也是由一些零件构成,上面就介绍一下FOSUserBundle的使用。

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

壹 、基本使用

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

      以symfony 3.3为例,

环境准备与大概浏览

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

笔者们精晓,controller负责处理每一个跻身Symfony2应用程序的请求。实际上,controller把抢先3/6的劳顿工作都托付给了别样地方,以使代码能够被测试和录取。当1个controller需求生成HTML,CSS大概别的剧情时,它把那一个干活儿给了3个模板化引擎。

      首先大家要求先安装一下FOSUserBundle。

见怪不怪于在windows使用netbean编辑器并接纳virtualbox虚拟centos系统,
预将nginx+php-fpm+mysql,  当然apache也是正确的挑选,  
使用

 

模板:

       第壹步:需求先下载FOSUserBundle

壹 、下载与环境设置

{% func %}平日是带有1个twig函数例如 for;

二个模板仅仅是1个文件文件,它能生成自由的文本格式(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>

        第1步:需求在基础之中注册它,

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

{% for i in 0..10 %}

www.5929.com,不过Symfony2包中享有一种更抓牢有力的模板化语言叫Twig。
它同意你写简洁,可读法模板语言。对页面设计师更和谐,在很多上面比PHP模板更压实劲。

      www.5929.com 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>

      第①步:创造用户类

# /etc/hosts 127.0.0.1 symblog dev symfony

{% endfor %}

在这几个Twig文件中,定义了多个连串的特别语法

        那一个包的对象是将一些User类保存到数据库(MySql,MongoDB,CouchDB等)。那么,你的首先份工作正是User为你的应用程序创造三个类。那几个类能够无限制翻看和操作:添加你觉得有用的其余性质或方法。

3.手动下载symfony2, 也得以参照这些页面用Composer
举办设置。

理所当然也得以打字与印刷对象,例:

{{…}} : “说一些事”,
打印一个变量只怕三个表明式的值到模板。
{%…%} :
“做一些事”,控制模板逻辑的价签,它用于实施比如for循环语句等。
{# 那是1个注释 #}, “注释”。

        该bundle提供了曾经为超越3/6字段映射的基类,以便更易于地创制您的实体。

唯一须求小心的是: app/cache
和app/logs目录需求设置成777权力。windows的开发条件应当不设有那几个标题。

{% for user in users %}

Twig也包罗filters,在渲染在此之前修改内容。下边包车型大巴话语显示把title变量全部渲染为大型。

                   
www.5929.com 2

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

<span>user.username</span>

{{ title|upper }}

      a)Doctrine ORM用户类

此时理应可以透过 访问到symfony的暗中同意页面,
有多少个demo能够参考学习。

{% endfor %}

Twig暗许情况下有第一次全国代表大会群的价签(tags)和过滤器(filters)能够选择。当然你也可以遵照供给丰盛增加。注册一个Twig扩充卓殊不难,创制三个新劳动并把它标志为Twig.extension
标签。就跟你看看的一样,Twig也补助功能和新功能的增加。比如,下面选择一个标准的for标签和cycle功用函数来打字与印刷十二个div
标签,用odd,even 类代替。

      www.5929.com 3

www.5929.com 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情势可用时,1个twig模板假若发生变更将会被电动重新编写翻译。那就代表你能够在支付进程中自由的改动模板,而毋庸担心供给去排除内部存款和储蓄器了。当debug形式被关门时,你必须手动的解决Twig缓存目录,以便能够再一次生成Twig模板。

      www.5929.com 5

Bundles(只怕能够称之为包, 束, 程序集,只怕项目,
照旧用英文吧)是symfony的功底东东, 3个个享受出来可重复利用的代码封装,
甚至于symfony自己是用作1个bundles运转的。  包蕴控制器、模块、模板,
甚至于图像与js, css样式表等财富。   很糊涂的事物,
不相同不一致的bundles使用了php5.3现在的命名空间, 超过三分之一cpenal,
da虚拟主机好像唯有php5.2版本吧, 不能够运营symfony2了。

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

模板继承和布局

      c)CouchDB用户类

② 、制造3个Bundle

 

大部的时候,模板在档次中用来共享通用的成分,比如header,footer,sidebar等等。在Symfony第22中学,大家将选取差别的想想角度来相比那么些难题。3个模板能够被其它的模板装饰。这么些的工作原理跟PHP类分外像,模板继承让您可以创设二个基础”layout”模板,它包括你的站点的具有通用成分并被定义成blocks。那里的block能够类比为PHP基类的法门。
四个字模板能够持续基础layout模板不偏不倚写它任何1个block。

      www.5929.com 6

在底下的事例大校创设3个博客,  Symfony 提供了大量工具来急忙地创制项目。
比如大家可以用它来极快创设1个博客的基础bundle.

贰 、模版继承

近来先是创制三个base layout文件:

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

复制代码 代码如下:

在app/Resources/views目录下暗许会有三个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>

      www.5929.com 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>

      www.5929.com 8

在symfony中拥有应用的bundles都供给先被登记,
有个别bundles只会使用于开发测试环境(dev or test), 如前文提及的开发工具条.
下边那断代码显示了bundles创立命令如何注册BloggerBlogBundle那几个bundle.

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

以此模板定义了骨干的HTML发轫文书档案是3个大概的两列式页面。在那些页面中有三处{%
block
%}定义,分别定义了title,sidebar和body。各种block都能够被接续它的子模板重写只怕封存它未来的暗中同意完结。该模板也能被直接渲染,只可是只是显示基础模板的定义内容。

Symfony2框架创立项目与模板设置实例详解,Symfony2模版引擎使用验证手册。      在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
%}必须放在第1行,当使用{% block body
%}时,body这几个块中有着都被遮盖,若想保留用parent()函数例:

上面定义1个子模板:

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

路由

{% block body %}

Twig格式:

      www.5929.com 9

用作八个框架, 路由作用被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() ?>

      www.5929.com 10

prefix前缀选项允许我们得以将其放置于如blog、news等子目录下。
文件
除此之外以上配置文件外, 别的超越半数文件生成为src目录下, 就如超越百分之五十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的值,输出的始末如下:

      www.5929.com 11

Bundle生成器在src下素不相识成了暗中认可了控制器。 通过走访:
能够看到简单的致敬。
关于那几个页面是如何转变:

Symfony2框架创立项目与模板设置实例详解,Symfony2模版引擎使用验证手册。::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)二个模板文件中带有此外的沙盘文件

您能够依照你的内需展开多层继承。
Symfony2项目中貌似选取一种三层继承格局来公司模板和页面。当大家利用模板继承时,须要留意:

      www.5929.com 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
%}。有个别时候更好的缓解方案恐怕是把那几个剧情放到八个新模板中,然后在该模板中include它。

 

控制器

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

借使您必要从父模板中获取1个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模板的模版。

 

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

转变相对路劲:<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流程, 这么多文本的意义只是出口三个 “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/目录下的享有模板同名重写的,
那种办法给了大家1个精锐的途径来重写供应商提供的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. 可三番五次: 万分cool的贰个功力

  4. 康宁: 转义功效暗许开启, 甚至还足以为主要代码提供沙盒功效。

  5. 可扩张: 必要额外的定制功能, 能够每一日扩张

在Symfony第22中学模板系统的着力是模板引擎。那个一定的靶子承担渲染模板并回到它的内容。当您在控制器中渲染四个模板时,举个例子,你实际是在选用模板引擎服务。如:

标签和帮手类

越多内容, 请移步:

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

你已经主导理解了模版,它们怎么样命名如何使用模板继承等。最难通晓的一对已经过去。接下来大家将理解多量的可用工具来救助大家实施最通用的模版职责比如含有其它二个模板,链接3个页面可能隐含3个图形等。

可继承是贰个格外好的长处, 大家将运用三级继承结构来定制那几个模板,
那将允许大家在多个例外层级修改模板, 方便轻易定制。

等同于

Symfony第22中学带有了血多系列化的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中学自动工作。当然它能够在应用程序配置文件中布署。

您恐怕时时想在七个分歧的页面中涵盖同1个模板或然代码片段。比如3个应用程序中有”音信作品”,模板代码在显示一片小说时恐怕用到小说详细页面,三个有血有肉最盛行小说的页面,或许四个最新篇章的列表页面等。

下面代码在引入了一个js文件, 在ie9版本前的浏览器中达成html,
以及三个css文件导入google fronts.
那构成了网页的重中之重内容结构, 也就是drupal的html.tpl.php+page.tpl.php.
让我们看一下尾部文件

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

当您必要选定一些PHP代码,你平凡都以把那些代码放到贰个PHP类也许函数中。同样在模板中你也足以如此做。通过把可接纳的代码放到三个它本人的模板中,然后把这几个模板包含到别的模板中。比如大家创造二个可选择模板如下:

复制代码 代码如下:

六 、模版复写

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/ 文件夹下边包车型地铁文本。

7、输出转义

接下来大家把它涵盖到别的模板定义中:

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

为了制止XSS攻击供给转义输出,在symfony2
Twig模版引擎中输出转义是暗许开启的,php模版引擎不开启

Twig格式:

复制代码 代码如下:

在某个案例中,当正在渲染2个被信任变量和无法被清理的标识时,你要求撤消输出清理。假设管理用户可以写蕴含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”) }}

有点景况下,你要求比包括不难模板做到越来越多。倘诺你有1个菜单栏sidebar在您的布局文件中来体现最新的篇章。获取三篇最新篇章只怕须要查询数据库也许实施别的富含众多逻辑的操作,那样就无法在二个模板中开展了。那种状态的消除方案是简答键入1个完整的controller到你的模版。首先创制二个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,你须要运用3个专业的字符语法来表示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

不论是什么样时候,你需求2个变量或然局地列新闻时,你不要在模板中访问,而是考虑渲染2个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');
}
}

在您的应用程序中创建2个链接到其余页面对于1个模板来说是再普通但是的业务了。大家应用path
Twig函数基于路由配置来生成UCRUISERL而非在模板中硬编码UCRUISERL。未来只要您想修改一个一定页面包车型客车U卡宴L,你只须要变更路由布署即可,模板将自动生成新的ULacrosseL。比如大家打算链接到”_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来引用这几个路由链接该页面。

www.5929.com 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

地点的始末会变卦3个ULacrosseL /

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

我们看另三个错综复杂一些的路由定义:

控制器: 在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函数来生成多少个绝对路径的U大切诺基L:

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

在PHP代码模板中,你必要给generate()方法传入第5个参数true
来兑现生成相对路径U科雷傲L

<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标签里,另2个叫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>

那太简单了!但万一您想从子模板中富含3个外加的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创设一个模板。比如三个AcmeBlogBundle,
它有协调的3个模板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’ %} 。

三模板情势对于3个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>

那种处境看上去,没多大害处,假诺贰个用户知道这一步,它完全有能力写一个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()来相当慢的查看一个值的变量传递。同样在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 %}

模板格式:

模板是2个渲染任何格式内容的通用的办法。当先四分之二情形下,大家选拔模板来渲染HTML内容。模板同样也能渲染想javascript,CSS,XML以及你能设想到的其它格式内容。比如,同七个财富resource常常被渲染为区别的格式。把稿子目录页渲染为XML,你须求在模板的称呼和浩特中学包罗相应的格式即可。

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

其实,那里只是命名上有了转变,而模板并不曾真正的基于不一致的格式渲染区别。在大多数景观下,你大概想让单一的controller依据请求的格式区别渲染多个不等的格式。下边是2个一般性的写法:

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

Request对象的getRequestFormat()方法默许再次回到值为html,
request的格式经常是在路由时间控制制的。比如/contact 设置的央求格式是html,而
/contact.xml 设置的央求格式则是
XML。成立3个含有呼吁格式的链接,只须要在参数哈希表中涵盖
_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中学的模板引擎是2个无敌的工具,你能够用它来依照须要扭转让承包蕴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安装第2方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间展开询问的法门分析

Leave a Comment.