Symfony2学习笔记之模板用法详解

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

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

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

PHP代码格式:

 

开拓上述模板文件, 格外不难的一句代码:

 

你也得以在{% block %}区域也许全部模板中关闭安全保卫安全。

 

格外不难的代码,1. 一连了一流模板, 并且为博客内容尤其定制了侧边栏,
很肯定大家并不想博客的布局与别的页面一样。
类似drupal7中page–content-type.tpl.php模板,
定制了某一非同一般类型内容的布局。

 

在PHP中安全出口保卫安全不是机关完结的,那就表示只有你显得的选料来对有个别输出变量进行尊崇,否则输出都以不安全的。大家运用view的方法escape()来对出口变量举办安全出口保卫安全:

      第一步:成立用户类

二 、成立一个Bundle

铺排和动用模板服务

Twig格式:

    

<!– 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>
{% 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 %}

您可以依据你的急需开始展览多层继承。
Symfony2项目中一般采纳一种三层继承模式来协会模板和页面。当大家应用模板继承时,须要小心:

      天天都想写博客,但却不了解写什么,有怎么样想要理解的,能够下评论区留言,作者抽时间写下。

地方代码首先继承了第③回定义那一个block的文件, 然后修改它。
网站标题部分会输出 ‘The blog title goes here – symfony’。
貌似而言, 大家引用模板文件时会选用bundle:controller:template,
可是以上代码并不曾bundle 和controller,
不分包那八个字段会直接引用app/Resources/views/ 文件夹上面包车型地铁文件。

在一些案例中,当正在渲染三个被信任变量和不可能被清理的标识时,你必要撤除输出清理。假如管理用户能够写包括HTML代码的稿子。缺省气象下,Twig将清理小说内容。要寻常地渲染它,添加raw过滤器:{{
article.body | raw }}。

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

 

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

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

而recentList模板则一定简单:

 

复制代码 代码如下:

 

您曾经基本精晓了模版,它们怎么着命名如何使用模板继承等。最难领悟的局地已经身故。接下来大家将理解大批量的可用工具来协理大家实施最通用的模版职责比如含有此外2个模板,链接3个页面只怕隐含一个图片等。

      图片 1

在css样式表中, 大家能够发现另二个Twig标签{{,
这是3个出口(说些什么)标签。

叁 、模版分化命名情势的存款和储蓄路径:

<!-- 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>

      a)Doctrine ORM用户类

复制代码 代码如下:

{% block body %}

先选拔parent()函数来获取父模板中的全体stylesheets。你也足以涵盖财富职责到你的bundle的Resources/public
文件夹。你必要实施如下命令行:

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

你恐怕感兴趣的篇章:

  • Symfony查询方式实例小结
  • Symfony2联合查询完毕格局
  • Symfony2使用Doctrine进行数据库查询艺术实例总结
  • 高质量PHP框架Symfony2经典入门教程
  • Symfony2达成从数据库获取数据的法子小结
  • Symfony2学习笔记之模板用法详解
  • Symfony2框架学习笔记之表单用法详解
  • symfony2.4的twig中date用法分析
  • Symfony2学习笔记之控制器用法详解
  • Symfony2安装第一方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间开始展览询问的主意分析

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

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

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

// 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));
}
}

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

PHP代码格式:

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

注册Bundles

在app/Resources/views目录下暗中同意会有五个base.html.twig

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

        composer require friendsofsymfony/user-bundle “~2.0”

复制代码 代码如下:

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

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

 

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

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

<!-- 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() ?>

        该bundle提供了已经为半数以上字段映射的基类,以便更便于地开创您的实体。

复制代码 代码如下:

 

该模板化引擎服务在Symfony2内部是先期铺排好机关工作的。当然它也得以在应用程序的安插文件中展开安插。比如:

      b)MongoDB用户类

壹 、下载与环境设置

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

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

       

复制代码 代码如下:

{% for user in users %}

Twig中的安全出口

 

以上正是symfony的整套mvc流程, 这么多文本的职能只是出口八个 “hello
world”. 理论上毫不bundler创立器,
只是手动成立上述文件也得以完结平等成效。耗费的时日就多了去了。

<span>user.username</span>

PHP代码格式:

      图片 2

私下认可控制器

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

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

      c)CouchDB用户类

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

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

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

 

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

等同于

大家看另三个繁杂一些的路由定义:

      到次配置FOSUserBundle用户登陆验证算是达成。当然为了方便大家能够配备新的模版覆盖原来的。新模板的配置格局如下:

复制代码 代码如下:

(2)三个模板文件包涵别的多少个控制器的结果

{# 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 %}
{# ... #}

       实体配置格局上篇博客中早已说过,那里就不再提了。希望可以帮到必要的人。

复制代码 代码如下:

为了防备XSS攻击需求转义输出,在symfony2
Twig模版引擎中输出转义是私下认可开启的,php模版引擎不开启

YAML 格式:

      图片 3

简单的讲的三个流程扩充了有关页面:

理所当然也能够打字与印刷对象,例:

在意,如若app/Resources/AcmeBlogBundle目录不设有,能够手工业建立。之后你就能够轻易的性格化处理该模板了。

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

参数: 进行url检查和测试, 符合/hello/{name}结构的任意值将被授予给{name},
艺术: 没有对方式开始展览限定, 理论能够put, get, post,
delete全体的操作都可以展开。
三番五次: 如若符合以上两条, 那么{name}将会传导至特定文件,
以上为src/Blogger/BlogBundle/Controller/DefaultController.php文件中的default控制器的index行为将被使用。

一 、基本接纳

重写Bundle模板:

 

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

{% for i in 0..10 %}

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

      为了让Symfony的安全组件使用FOSUserBundle,必须告诉它在security.yml文本中那样做。该security.yml文件是包罗应用程序基本安全计划的地点。

地点代码在引入了3个js文件, 在ie9版本前的浏览器中贯彻html,
以及多少个css文件导入google fronts.
这构成了网页的重点内容结构, 也便是drupal的html.tpl.php+page.tpl.php.
让大家看一下头部文件

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

PHP代码格式:

      图片 4

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

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

下一场大家把它蕴涵到此外模板定义中:

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

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

⑤ 、别的扶助函数

要是您发以后五个模板中有再一次的情节,那说不定就意味着你须要为该内容在父模板中定义1个{%
block
%}。有个别时候更好的消除方案大概是把这几个内容放到四个新模板中,然后在该模板中include它。

      当然也能够一贯从品种的vendor\friendsofsymfony\user-bundle\Resources\views下直接copy过去。

Bundles(大概能够称之为包, 束, 程序集,也许项目,
依然用英文吧)是symfony的底子东东, 三个个享受出去可另行使用的代码封装,
甚至于symfony本人是作为贰个bundles运行的。  包括控制器、模块、模板,
甚至于图像与js, css样式表等能源。   很糊涂的东西,
差距分歧的bundles使用了php5.3以往的命名空间, 大部分cpenal,
da虚拟主机好像唯有php5.2版本吧, 不可能运营symfony2了。

注:{% extends
%}必须放在第壹行,当使用{% block body
%}时,body这几个块中颇具都被掩盖,若想保留用parent()函数例:

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

      以symfony 3.3为例,

// 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');
}
}

(1)三个模板文件中蕴藏其余的模版文件

::base.html.twig
表示二个利用程序级的基模板也许布局文件。注意,该语句五个冒号初叶,意味着没有bundle和controller部分,那注解该文件不在某些bundle中,而是位于根目录下
app/Resources/views

      配置完结后能够直接在域名后输入login、register进行登录注册。

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

七 、输出转义

Hello <?php echo $name ?>

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

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

 

YAML格式:

        第壹步:需求在基本之中注册它,

说到底二个标签并不曾在上述代码中冒出, 它是{#, 只是贰个诠释标签

::base.html.twig:这么些语法钦点了二个应用程序范围的模板或布局。注意该字符串由七个冒号(::)开端,意思是bundle和controller部分被忽略。那意味该模板没有放在任何Bundle之中,由此它应该置身app/Resources/views/目录中

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

      图片 5

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

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

甭管怎样时候,你须要贰个变量只怕有个别列信息时,你不用在模板中做客,而是考虑渲染1个controller。因为Controller能够更快的施行并且很好的增进了代码的集团和重用。

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

三 、让我们开头创办博客的主页

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

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

      图片 6

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

贰 、模版继承

<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" />

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

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

因为Symfony2框架自个儿也是三个Bundle,焦点模板也足以用相同的形式覆写。举个例子,核心的FrameworkBundle包蕴着大批量的“分外”和“错误”模板。要覆写它们,能够将它们从FrameworkBundle的Resources/views/Exception目录中拷贝到,正如你所想,app/Resources/FrameworkBundle/views/Exception目录中。(这些比较实用)

大部分的时候,模板在档次中用来共享通用的因素,比如header,footer,sidebar等等。在Symfony第22中学,我们将应用不一致的盘算角度来比较那些难点。二个模板能够被此外的模板装饰。这一个的劳作规律跟PHP类万分像,模板继承让您能够创建2个基础”layout”模板,它涵盖你的站点的持有通用成分并被定义成blocks。那里的block能够类比为PHP基类的法子。
2个字模板能够三番五次基础layout模板天公地道写它任何贰个block。

       第壹步:供给先下载FOSUserBundle

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

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

模板后缀(suffix)

      图片 7

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

{{# #}}注释;

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

      图片 8

创制路由将首页引导到我们刚创建的页面:src/Blogger/BlogBundle/Resources/config/routing.yml

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

那时候,大家就足以应用dump函数来查阅模板参数了:

      图片 9

那儿应该能够通过 访问到symfony的私下认可页面,
有多少个demo能够参照学习。

下一场将协调的沙盘文件一而再此

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

 

3.手动下载symfony2, 也得以参照这几个页面用Composer
进行设置。

⑥ 、模版复写

{{ title|upper }}

                   
图片 10

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

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

那太不难了!但一旦你想从子模板中富含二个十分的stylesheet大概javascript怎么做吧?比如假诺你有三个联络页面要求包含二个contact.css样式表只用于该页面。在您的contact页面模板内部,你能够如此完成:

      图片 11

Bundler模板–level 2

倘使with三个参数能够{‘foo’:foo, ‘bar’:bar}

Twig暗许情状下有一大群的标签(tags)和过滤器(filters)能够行使。当然你也得以依据要求添加扩张。注册一个Twig扩大格外简单,创设一个新服务并把它标志为Twig.extension
标签。就跟你见到的一致,Twig也支撑功用和新职能的增进。比如,上面接纳三个标准的for标签和cycle功用函数来打印13个div
标签,用odd,even 类代替。

Bundle生成器在src下素不相识成了暗许了控制器。 通过拜访:
可以见见不难的问讯。
关于那几个页面是怎样转变:

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

您或许感兴趣的文章:

  • Symfony查询方式实例小结
  • Symfony2联合查询达成情势
  • Symfony2使用Doctrine举办数据库查询办法实例总计
  • 高品质PHP框架Symfony2经典入门教程
  • Symfony2完毕从数据库获取数据的方法小结
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2框架创设项目与模板设置实例详解
  • symfony2.4的twig中date用法分析
  • Symfony2学习笔记之控制器用法详解
  • Symfony2安装第壹方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间开始展览询问的点子分析

复制代码 代码如下:

<h3>This is childContent</h3> …

PHP代码格式:

复制代码 代码如下:

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

Hello {{ name }}

其一标签用于出口变量或许表达式, 上边例子输出了asset函数的重返值,
那几个函数提供可移植的点子来回到css,js, 图片的地址。

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

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

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

{{ parent() }}

标签和助手类

路由

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

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

主模板–level 1

{% endfor %}

<!-- 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>

习惯于在windows使用netbean编辑器并行使virtualbox虚拟centos系统,
预将nginx+php-fpm+mysql,  当然apache也是未可厚非的取舍,  
使用

{% endfor %}

模板的命名和存款和储蓄地点

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

Symfony2总是先找找位于app/Resources/BUNDLE_NAME/views/目录的沙盘。如果该模板不存在,它将一而再在Bundle本人之中的Resources/views目录中寻觅。所以可以将模版文件写在app/Resources/BUNDLE_NAME/views/目录下来覆盖Bundle本身内部的Resources/views目录下的沙盘文件。

当您须要选定一些PHP代码,你平凡都以把这么些代码放到1个PHP类也许函数中。同样在模板中您也能够那样做。通过把可选取的代码放到1个它本身的沙盘中,然后把这么些模板包罗到别的模板中。比如大家创造3个可选拔模板如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注