symfony2学习笔记(1)——安装入门

一、安装

   (1)Composer安装(可选)

$ curl -s https://getcomposer.org/installer | php
$ php composer.phar create-project symfony/framework-standard-edition /path/to/webroot/Symfony '2.5.*'

下载后目录结构:

path/to/webroot/    # 你的web目录
    Symfony/        # Symfony站点目录
        app/
            cache/
            config/ # 配置文件
            logs/   
        src/    # 放置自己编写的代码
            ...
        vendor/     # 第三方库
            ...
        web/        # 静态图片和js等前台使用
            app.php # 正式产品入口(有缓存)
    app_dev.php # 开发阶段入口(无缓存)
            ...


  (2)官方推荐安装

$ sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
$ sudo chmod a+x /usr/local/bin/symfony
symfony new my_project

二、安装和更新第三方库

 安装和更新第三方库(如没有下载vendor文件夹的话,否则跳过)

$ php composer.phar install

三、配置权限和目录

   (1)配置站点跟目录至symfony/web。

      nginx配置文件:

server {
    listen             80;
    server_name  localhost;
    root /Users/wyl/WebRoot/Myself/symfony/web; 
    access_log /var/log/nginx/localhost.access.log;
    set $root           $document_root;     
           
    location / {
        index  app.php index.php index.html;
        try_files $uri @rewriteapp;
    }
           
    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }
           
    location ~ ^/(app|app_dev|config).php(/|$){
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
           
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
           
        #pathinfo
        set $real_script_name $fastcgi_script_name;
        set $path_info "";
        if ( $fastcgi_script_name ~ "^(.+?.php)(/.+)$"){
            set $real_script_name $1;
            set $path_info $2;
        } 
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;
    }
}

(2) 对 app/cache/* 和 app/logs/* 配置可写权限,此处不详细说明。

打开 http://localhost/config.php,查看是否有未安装的扩展,直至出现以下界面:

访问http://localhost/app_dev.php/,出现以下画面,即配置成功了。

../_images/welcome.jpg

四、需开启的扩展

intl、opcache(加速)


PHP编译配置:

./configure --prefix=/opt/php5.5
--enable-fpm
--with-fpm-user=www
--with-fpm-group=www
--with-libxml-dir
--with-openssl
--with-pcre-regex
--with-zlib
--enable-bcmath
--with-bz2
--enable-calendar
--with-curl
--with-gd
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
--enable-mbstring
--with-mcrypt
--with-mysql
--with-mysql-sock=/tmp/mysqld.sock
--enable-pcntl
--with-pdo-mysql
--enable-soap
--enable-sockets
--enable-mysqlnd
--enable-opcache

五、Symfony简单介绍

(1)设定Symfony:网页界面

(2)Bundle:组成Symfony2的积木

(3)建立Bundle

(4)注册Bundle

(5)网址路径

(6)预设结构

(7)预设Controller

(8)网址路径

(9)关于Controller

(10)关于样板(也就是View)

(11)整理

(12)样板

(13)布局结构

(14)主要样板-第1层

(15)主要样板-第2层

(16)页面样板-第3层

(17)关于我们页面

(18)链接这些页面


Note:

你也会发现在欢迎页下方的一个工具列,这是开发者工具,可以提供你许多关于应用程式状态的宝贵资讯。可以透过这个工具列看到的这些资讯包含页面执行时间、记忆体用量、资料库查询、认证状态等等。预设这个工具列只会在执行于dev环境时显示,在正式环境提供这个工具列会造成很大的安全风险,因为它揭露了应用程式的许多细节。这个工具列的参考资讯会在介绍新功能时提到。


(1)设定Symfony:网页界面


Symfony2 加入了一个网页界面来进行网站的多个设定,像是资料库。我们在这个专案会需要一个资料库,所以现在就开始使用这个设定工具。

浏览http://symblog.dev/app_dev.php/并且点选设定按钮,进入设定资料库的细节(这个教学假设使用MySQL资料库,不过你可以选择任何可以使用的资料库),接着在下一页会产生一个CSRF权杖,你会看到Symfony2产生的各种参数。

注意这个页面的说明,有时你的app/config/parameters.ini 档案无法直接写入,所以你会需要复制这些设定到位于app/config/parameters.ini 的档案(这些设定可以直接取代档案中既有设定)。


(2)Bundle:组成Symfony2的积木


Bundle是任何Symfony2应用的基础组成积木,事实上Symfony2框架本身也是个Bundle。Bundle让我们可以分离功能来提供可以重复运用的单位程式码。它们封装了整个为了Bundle目的所需要的东西,包含controllers 、 model与样板,以及许多资源,以及许多像是图片与CSS之类的资源。我们会建立一个使用Blogger命名空间的Bundle来制作网站。如果你不熟悉PHP的命名空间,你应该要花些时 间去阅读相关文件,因为在Symfony2中大量使用,每个元件都使用了命名空间。可以参考 Symfony2 autoloader了解Symfony2如何作到自动载入功能。

Tip:

确实了解命名空间可以协助排除一些常见问题,像是资料夹结构与命名空间结构不一致你就会遇到。


(3)建立Bundle


为了要封装部落格的功能,我们要建立一个Blog Bundle。它将会包含所有需要的档案,这样一来可以轻易的移植到另一个Symfony2 应用程式。Symfony2 提供了许多工具来协助我们执行一般操作,其中一个就是Bundle产生器。

要执行Bundle产生器请执行下面指令,画面会显示一些提示让你设定Bundle应该如何配置。在这里应该要使用每个提示的预设值。

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

产生器执行后,Symfony2 会建立基本的Bundle结构,在这里需要注意一些重要的变动。

在命令执行中会问你是否创建完整的目录结构,是否自动更新Kenel(也就是下一步的注册这个Bundle,如果你选择了yes,那么下一步就不需要操作了),是否自动加载该Bundle下面的路由。


Tip:

其实你并不需要使用Symfony2 提供的产生器工具,它们只是放在那里来帮你,你当然可以手动建立Bundle的资料夹结构与档案。虽然使用产生器并非必要的,它们的确提供了一些好处,像是它们可以快速的执行所有必要工作来让Bundle产生与执行,其中一个例子就是注册Bundle。


(4)注册Bundle(第3步自动加载)


我们的新BundleBloggerBlogBundle已经注册在核心档案app/AppKernel.php,Symfony2要求我们注册所有应用程式使用到的Bundle,你也会注意到一些Bundle只有在dev或test环境下注册,在正式环境prod载入这些Bundle会因为一些用不到的功能而徒增系统负担。下面这段程式码显示如何注册BloggerBlogBundle。

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

(5)网址路径(第3步自动加载)


Bundle的路径已经汇入到应用程式的主要网址路径档案app/config/routing.yml。

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

prefix选项让我们可以挂载整个BloggerBlogBundle的网址路径,在我们的例子中已经选择挂载在预设的/。如果你想要所有的网址路径开始是/blogger,可以将prefix改为prefix: /blogger。

更多的路由配置请参考:symfony学习笔记(3)——URL路由


(6)预设结构(第3步自动加载)


在src资料夹已经建立了预设的Bundle结构,开始的是最上层Blogger资料夹,它直接对应到我们为Bundle设定的

Blogger命名空间,在这之下可以看到包含实际Bundle的BlogBundle资料夹,里面的内容结构有一部份名称就解

释了它的用途。


(7)预设Controller


在Bundle产生器制作的档案中Symfony2 建立了一个预设controller ,我们可以透过浏览

http://symblog.dev/app_dev.php/hello/symblog 来执行它,你可以看到一个简单的欢迎页。试着修改网址的symblog为你所制作的名称,我们可以借此在比较高的层级检验页面的产生。


(8)网址路径


BloggerBlogBundle的路径档案放在src/Blogger/BlogBundle/Resources/config/routing.yml,包含了下面的预设网址路径规则。

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

网址路径是由一个样式与一些预设选项组成,样式会用来检查网址,预设选项则是指定在网址符合时应该要执行的controller 。在样式/hello/{name}中,{name}替位符号会对应到任意数值,因为没有设定特别条件。网址路径也没有指定任何内涵、格式或

HTTP 方法,没有指定HTTP 方法表示来自GET 、 POST 、 PUT 等方式的请求都会视为符合样式。

如果网址符合所有指定的条件,就会执行预设选项中设定的_controller , _controller选项指定了controller的逻辑名称,让Symfony2可以对应到一个指定的档案。上面的例子会执行Default controller中的indexAction函数,档案位置在src/Blogger/BlogBundle/Controller/DefaultController.php。

更多的路由配置请参考:symfony学习笔记(3)——URL路由


(9)关于Controller


在这个例子中的controller非常简单,DefaultController继承了Controller,它提供了一些有用的方法,像是下面用到的 render。

由于我们的网址路径定义了一个替位符号$name,它会被送到方法中作为参数。

index方法只是通过render 方法来指定位于BloggerBlogBundle预设样板资料夹中的index.html.twig模板来渲染页面。

样板名称的格式是: Bundle名称:文件夹:模板名称  

文件夹一般以Controller名称命名,这样方便找模板,如:bundle:controller:template

在我们的例子中是BloggerBlogBundle:Default:index.html.twig,路径对应到BloggerBlogBundle

下Default文件夹下的index.html.twig样板,实际上的路径为

src/Blogger/BlogBundle/Resources/views/Default/index.html.twig。在应用与所对应的Bundle中可以在样板显示时指定许多不同的样板格式,在这个章节的后面会做介绍。

我们也透过array选项传递了变数$name到样板。

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

关于Controller详细参考:symfony学习笔记(8)——控制器(Controller)

(10)关于样板(也就是View)


如你所见,这个样板非常简单,只有印出Hello 以及接着controller 传送过来的参数name 。

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

了解更多的view部分可参考:symfony学习笔记(7)——Twig模板


(11)整理


由于我们不需要一些产生器制作出来的档案,可以做些整理。

controller 档案src/Blogger/BlogBundle/Controller/DefaultController.php 可以删除,包含样板资料夹 src/Blogger/BlogBundle/Resources/views/Default/ 与其中的内容。

最后移除定义在 src/Blogger/BlogBundle/Resources/config/routing.yml 的网址路径。


(12)样板


在Symfony2中使用样板预设有Twig与PHP两个选择,在不同的函式库当然可以做不同的选择,这要感谢Symfony2实做了Dependency Injection Container 我们会基于下面理由选择使用Twig 。

Twig 非常快,Twig 样板会编译成PHP 物件,所以使用Twig 样板不会造成太大的负担。

Twig 非常简洁, Twig 让我们可以透过少量程式码执行样板功能, PHP 在部份情况下则是会相对冗长。

Twig 支援样板继承,这是笔者个人喜爱的特色之一。样板能够继承与覆写其他样板,让子样板可以修改来自父样板的预设值。

Twig 非常安全, Twig 预设启用了输出的检查,甚至还为汇入的样板提供一个沙箱环境。

Twig 容易扩充,Twig 带来了许多你对样板期待的常见核心功能,而一些你预期需要的其他功能, Twig 可以轻易的延伸。

这只是Twig的一些好处,更多关于为什么该用Twig的理由可以参考Twig官方网站。

了解更多的twig部分可参考:symfony学习笔记(7)——Twig模板


(13)布局结构


由于Twig支援样板继承,我们接着使用三阶层继承 方法,这个方法让我们可以在应用程式中透过三个独立的层次调整画面,提供更多客制空间。


(14)基础样板-第1层


现在就开始建立我们symblog的基础区块阶层样板,在这里需要两种档案,样板与CSS。由于Symfony2支援HTML5 ,我们也会使用到它。

<!-- app/Resources/views/base.html.twig -->
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html"; charset=utf-8" />
        <title>{% block title %}symblog{% endblock %} - symblog</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 class="top">
                    {% block navigation %}
                        <nav>
                            <ul class="navigation">
                                <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="#">symblog</a>{% endblock %}</h2>
                    <h3>{% block blog_tagline %}<a href="#">creating a blog in Symfony2</a>{% endblock %}</h3>
                </hgroup>
            </header>
                   
            <section class="main-col">
                {% block body %}{% endblock %}
            </section>
            <aside class="sidebar">
                {% block sidebar %}{% endblock %}
            </aside>
                   
            <div id="footer">
                {% block footer %}
                    Symfony2 blog tutorial - created by <a href="https://github.com/dsyph3r">dsyph3r</a>
                {% endblock %}
            </div>
        </section>
                   
        {% block javascripts %}{% endblock %}
    </body>
</html>

Note:

在这个样板引用了三个外部档案, 1个JavaScript与2个CSS,这个JavaScript程式修正IE在9以前版本不支援HTML5的问题, 2个CSS档案汇入的字型是来自Google Web font。

这个样板标示了我们部落格网站的主要结构,大部分的样板由HTML 组成,包含了少量的Twig 指令,我们接着检查这些Twig 指令。


先将焦点放在文件的HEAD 部份,从title 开始看:

<title> {% block title %}symblog{% endblock %} - symblog </title>

第一个你会注意到的是奇怪的{%标签,这不是HTML ,更不会是PHP ,这是3个Twig标签中的一个,这个标签是Twig

Do something标签,用来执行控制语法或是定义区块元素的指令,完整的

控制结构 可以在Twig手册看到。我们在title定义的Twig区块会做两件事情,它会设定区块识别为title ,并且在block与endblock之间提供一个预设输出指令,透过定义区块我们可以获得Twig继承模式的好处。举例来说,在一篇部落格文章我们想要设定页面标题来反应,我们可以继承这个样板并且覆盖title区块。

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

在上面的例子中,我们延伸了应用程式的基础样板与前面定义的title区块,你会注意到使用在extends中的样板格式少了 Bundle与Controller部份,记得样板格式是bundle:controller:template。透过排除Bundle与Controller部份,我们是指定使用应用程式层级的样板,会放在app/Resources/views/。

接着我们定义另外一个title 区块,并且放入一些内容,这里是放入部落格的标题。由于父样板已经包含了title 区块,它会被我们的新样板所覆盖, title 区块现在会输出成'The blog title goes here - symblog' 。这个Twig 提供的功能在建立样板时可以弹性运用。

在样式表区块我们加入了下一个Twig标签{{,或是称之为Say something标签。

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

这个标签是用来印出变数或描述的数值,在上面的例子会印出asset方法所传回的数值,这提供了我们一个可携式方法来连结应用程式的资源,像是CSS 、 JavaScript与图片。

{{标签也可以搭配过滤器在输出前处理内容。

{{ blog.created|date("dmY") }}

完整的过滤器清单可以参考 Twig手册。


最后一个Twig标签并没有出现在样板中,它是备注标签{#,用起来像这样:

{# The quick brown fox jumps over the lazy dog #}

在这个样板中不会再加入其他概念,它提供了主要的版面准备让我们在需要时进行客制。

接着加入一些风格,建立一个风格表在web/css/screen.css,然后加入下面内容,这会在主要样板中加入一些风格。

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

(15)Bundle样板-第2层


我们现在继续往上建立部落格Bundle的版面,建立一个档案在src/Blogger/BlogBundle/Resources/views/layout.html.twig 然后放入下面内容。

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

第一眼看到这个样板时也许会觉得有点简单,但简单就是个关键。第一是它延伸了我们之前建立的应用程式基础样板,其次是它用一些测试内容覆盖了原本的sidebar 区块。由于sidebar 会出现在部落格的所有页面,通常在这个阶层做些客制是正确的。你也许会问为什么不把客制的部份放在之前的应用程式样板,这样一来就可以出现在所有页面。这很简单,应用程式并不知道Bundle的任何资讯,也不应该知道。Bundle应该要自己包含所有功能,产生sidebar 区块就是这些功能之一。至于为什么不将它放在每一页的样板,这也很简单,因为这样一来我们建立一个新页面时就得复制sidebar 一次。进一步的,这个第2 层样板提供了弹性,让我们可以加入所有子样板都会用到的客制并且让它们继承。举例来说,我们也许想要调整每一页的页尾,这时候就适合在这个阶层调整。


(16)页面样板-第3层


最后我们准备好要制作controller 的版面,这些版面通常会跟controller 的方法产生关联,例如show 这个方法就会对应到一个部落格的样板show 。

我们开始建立首页的controller与它的样板,由于这是我们第一个建立的页面,我们需要建立controller 。将controller建立在src/Blogger/BlogBundle/Controller/PageController.php并且放入下面内容:

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

接着建立这个方法的样板,如同在controller方法中看到的,我们要建立用来产生首页的样板,将它建立在 src/Blogger/BlogBundle/Resources/views/Page/index.html.twig

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

这放入了我们可以指定的最后样板格式,在这个例子中,样板BloggerBlogBundle::layout.html.twig 继承的来源中,名称省略了Controller部份。当我们排除了Controller部份时,我们就是在指定使用Bundle层级的样板,它被放在src/Blogger/BlogBundle/Resources/views/layout.html.twig。


接着为我们的首页新增一个网址路径,更新Bundle网址路径设定在src/Blogger/BlogBundle/Resources/config/routing.yml

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

最后我们需要移除预设的Symfony2欢迎页面网址路径,也就是移除在网址路径档app/config/routing_dev.yml中dev 区域的 _welcome网址路径。


我们现在已经可以检视部落格的样板,用你的浏览器打开http://symblog.dev/app_dev.php/。


你应该可以看到部落格的基本样板,包含我们在相关样板覆写的主要内容与sidebar 对应区块。


(17)关于我们页面


这个教学的最后一个任务就是建立一个关于我们静态页面,这会展示如何去将页面连结在一起,进一步强调我们采用的三阶层继承方法。


网址路径


建立一个新页面时,第一个应该是建立对应的网址路径。开启BloggerBlogBundle的网址路径档案 src/Blogger/BlogBundle/Resources/config/routing.yml并且附加下面的路径规则。

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

关于Controller


接着开启Page controller ,档案在src/Blogger/BlogBundle/Controller/PageController.php并且新增处理关于我们页面的方法。

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

关于View


关于view ,建立一个新档案在src/Blogger/BlogBundle/Resources/views/Page/about.html.twig并且复制下面内容。

{# src/Blogger/BlogBundle/Resources/views/Page/about.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}
{% block title %}About{% endblock%}
{% block body %}
    <header> 
        <h1> About symblog </h1> 
    </header> 
    <article> 
        <p> Donec imperdiet ante sed diam consequat et dictum erat faucibus. Aliquam sit
        amet vehicula leo. Morbi urna dui, tempor ac posuere et, rutrum at dui.
        Curabitur neque quam, ultricies ut imperdiet id, ornare varius arcu. Ut congue
        urna sit amet tellus malesuada nec elementum risus molestie. Donec gravida
        tellus sed tortor adipiscing fringilla. Donec nulla mauris, mollis egestas
        condimentum laoreet, lacinia vel lorem. Morbi vitae justo sit amet felis
        vehicula commodo a placerat lacus. Mauris at est elit, nec vehicula urna. Duis a
        lacus nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices
        posuere cubilia Curae. </p> 
    </article>
{% endblock %}

关于我们页面没有特别的地方,唯一的方法只是用来透过测试内容产生样板档案。不过它依然可以带我们继续前进到下一个任务。


(18)链接这些页面


我们现在已经有关于我们页面,可以直接看看http://symblog.dev/app_dev.php/about。由于一般使用者是看不到这个页面,除非像我们手动输入完整的网址。可以预期的, Symfony2提供了两边对等的路径功能,它可以比对我们看到的路径,也可以产生这些路径所对应的网址。建议一定要使用Symfony2的路径功能,不要在应用程式冒险放入下面这样的连结。

<a href= "/contact" > Contact </a>
<?php  $this -> redirect ( "/contact" );  ?>

你也许想知道这个方法错在哪里,这也许是你经常用来连结页面的方式,不过这个方法会有下面问题:

它使用了实际连结并且完全忽略Symfony2 的网址路径系统,如果你想要修改联络我们页面的位置,你必需要找到所有使用实际连结的位置并且进行修改。

它会忽略环境中的controllers ,虽然我们还没解释环境是什么,但是你已经在使用了。app_dev.php前端controller让我们可以在dev环境中存取应用程式。如果你把app_dev.php改为app.php,应用程式就会在prod环境下执行。这些环境的重要性会在后面的教学做更多的说明,不过现在很重要的是需要注意,上面定义的实际连结不会依据我们目前的环境调整,因为前端controller并没有包含在网址中。

连结页面的正确方法是使用Twig提供的path与url方法,它们都很像,只是url方法会给我们完整的网址。我们来调整主要应用程式样板app/Resources/views/base.html.twig来连结关于我们与首页。

<!-- app/Resources/views/base.html.twig -->
{% block navigation %}
    <nav> 
        <ul  class= "navigation" > 
            <li><a  href= "{{ path('BloggerBlogBundle_homepage') }}" > Home </a></li> 
            <li><a  href= "{{ path('BloggerBlogBundle_about') }}" > About </a></li> 
            <li><a  href= "#" > Contact </a></li> 
        </ul> 
    </nav>
{% endblock %}

接着重新整理浏览器可以看到Home与About页面连结可以运作了,如果你检视页面原始码会发现,连结前面都会加上/app_dev.php/ 这就是上面提到的前端controller ,而且会看到path的使用会处理这个部份。


最后让我们更新主要图示连结到首页,更新位于app/Resources/views/base.html.twig的样板。

<!-- app/Resources/views/base.html.twig -->
<hgroup> 
    <h2> {% block blog_title %} <a  href= "{{ path('BloggerBlogBundle_homepage') }}" > symblog </ a> {% endblock %} </h2> 
    <h3> {% block blog_tagline %} <a  href= "{{ path('BloggerBlogBundle_homepage') }}" > creating a blog in Symfony2 </a> {% endblock % } </h3> 
</hgroup>


by 雪洁 2014-09-11 03:05:29 4646 views

3 Comments

刘66 2016-01-11 15:49:11
不错哦!
雪洁 2016-01-15 14:10:16
谢谢!
leo 2017-07-25 12:13:34
请问 这个用的symfony版本是多少呢
雪洁 2017-07-25 12:13:04
2.7
xiaomi 2018-01-29 13:21:42
支持一下
雪洁 2018-01-29 13:24:26
谢谢支持!
我来说几句

相关文章