この記事では、Symfony2 フレームワークのプロジェクト作成とテンプレート設定の方法を例を通して説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
環境の準備と概要
Windows で netbean エディターを使用し、virtualbox 仮想 centos システムを使用することに慣れています。もちろん、開発ドメイン名として Apache を使用することも良い選択です。ウィンドウとセントス。
1. ダウンロードと環境設定
1. centos 上で開発環境を構築する方法については詳しく説明しません。もちろん、Windows 上でも開発環境を構築することはできます。
2. liunxシステムの/etc/hostsファイルとwin7システムのC:WindowsSystem32driversetchostファイルを変更するための127.0.0.1の代わりにsymfonyを使用することについて(管理者権限で開く必要があります)
次のような、IP エイリアス 1 とエイリアス 2 に似たコンテンツを追加するだけです:
コードをコピーします コードは次のとおりです: # /etc/hosts 127.0.0.1 symblog dev symfony
3. symfony2 を手動でダウンロードするか、このページを参照して Composer とともにインストールできます。 http://symfony.com/doc/current/book/installation.html
唯一注意すべきことは、app/cache ディレクトリと app/logs ディレクトリは 777 権限に設定する必要があるということです。この問題は Windows 開発環境では存在しないはずです。
4. ダウンロードした symfony ファイルの Web ディレクトリを指すように、Apache または nginx 設定ファイルの symfony ドメイン名を変更します。
この時点で、http://symfony/app_dev.php から symfony のデフォルトページにアクセスできるようになります。参照して学ぶことができるデモがいくつかあります。
app_dev.php には、デフォルトで以下にロードされる開発ツールバーがあり、現在のページに関する情報が表示され、プログラムのデバッグが非常に容易になります。これは、環境変数が dev の場合にのみ表示されます。
5. Composer を使用してインストールする場合、mysql およびその他の関連情報を出力するように求められます。この情報を変更するか、ファイルを直接ダウンロードする必要がある場合は、「構成」ページに入って関連する設定を行うことができます。
バンドル (パッケージ、バンドル、アセンブリ、またはプロジェクトと呼ばれるかもしれません。英語にこだわりましょう) は symfony の基本的なもので、再利用可能なコード パッケージを 1 つずつ共有し、symfony 自体も 1 つのバンドルとして実行されます。コントローラー、モジュール、テンプレート、さらには画像、js、css スタイル シート、その他のリソースが含まれます。これは非常に厄介で、php5.3 以降の名前空間をさまざまなバンドルが使用しています。ほとんどの cpenal および da 仮想ホストには php5.2 バージョンしかなく、symfony2 は実行できません。
2. バンドルを作成します
次の例では、ブログが作成されます。Symfony は、プロジェクトを迅速に作成するための多数のツールを提供します。 たとえば、これを使用してブログの基本的なバンドルをすばやく作成できます。
コードをコピーします コードは次のとおりです: php app/consolegenerate:bundle –namespace=Blogger/BlogBundle –format=yml
実行後は、すべてのデフォルト設定を採用するだけです。 必要な基本的なコントローラー、モジュール、テンプレートを簡単に作成できます。 次の動作が含まれます:
バンドルを登録する
symfony で使用されるすべてのバンドルは最初に登録する必要があります。一部のバンドルは、上記の開発ツールバーなど、開発およびテスト環境 (開発またはテスト) でのみ使用されます。次のコード スニペットは、バンドル作成コマンドが BloggerBlogBundle を登録する方法を示しています。バンドル
リーリールーティング
ルーティング関数はフレームワークとして、バンドラー作成者によって app/config/routing.yml に作成され、設定情報を保存するために yml 形式が使用されます。
コードをコピーします コードは次のとおりです:
# app/config/routing.yml
ブロガーブログバンドル:
リソース: "@BloggerBlogBundle/Resources/config/routing.yml"
接頭辞: /
接頭辞オプションを使用すると、ブログ、ニュースなどのサブディレクトリに配置できます。
書類
上記の構成ファイルに加えて、ほとんどの MVC フレームワークと同様に、他のほとんどのファイルが src ディレクトリに生成されます。 Blogger ディレクトリは src の下に生成され、さまざまな関連情報を保存する BlogBundle サブディレクトリがあります。違いは、blogger と同様のディレクトリが PHP 名前空間に対応することです。
デフォルトコントローラー
バンドル ジェネレーターは、src の下にデフォルトのコントローラーを生成します。 簡単な hello は、http://symfony/app_dev.php/hello/world にアクセスすると表示されます。 このページの生成方法について:
ルーティング
まだルーティングです。違いは、前のルーティングが登録され、プログラム全体で使用されることです。ここでのルーティングは、特定のページの使用を制御し、BloggerBlogBundle を制御します。プログラムの断片:
コードをコピーします コードは次のとおりです:
# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_homepage:
パターン: /hello/{名前}
デフォルト: { _controller: BloggerBlogBundle:Default:index }
参数: 进行url检测, 符合/hello/{name}结构的任意值将被赋予给{name},
方式: 没有对形式进行限制, 理论可以put, get, post, delete所有的操作都可以进行。
后续: 如果符合以上两条, 那么{name}将会传导至特定文件, 以上为src/Blogger/BlogBundle/Controller/DefaultController.php文件中的default控制器的index行为将被使用。
控制器
在默认生产的bundler中, 控制器行为相当简单, {name}参数被传入并被传出到模板文件:
// 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模板文件.
模板文件
打开上述模板文件, 非常简单的一句代码:
{# src/Blogger/BlogBundle/Resources/views/Default/index.html.twig #} Hello {{ name }}!
以上就是symfony的整个mvc流程, 这么多文件的作用只是输出一个 “hello world”. 理论上不用bundler创建器, 只是手动创建上述文件也可以实现相同效果。花费的时间就多了去了。
回到正题, 我们是创建博客系统, 所以不需要 hello world,
1.移除控制器 src/Blogger/BlogBundle/Controller/DefaultController.php
2.移除模板 src/Blogger/BlogBundle/Resources/views/Default/
3.最后移除路由 src/Blogger/BlogBundle/Resources/config/routing.yml
整个世界清静了。
三、让我们开始创建博客的主页
Twig的优点
在symfony中我们可以使用 Twig和php(这不是废话嘛)作为模板。使用Twig的以下优点:
1. 快: 是编绎过的php类, 可以占用更少的资源
2. 简洁:想想看要打<?php ?>, Twig输入的内容要少很多。
3. 可继承: 非常cool的一个功能
4. 安全: 转义功能默认开启, 甚至还可以为重要代码提供沙盒功能。
5. 可扩展: 需要额外的定制功能, 可以随时扩展
更多内容, 请移步:http://twig.sensiolabs.org/
可继承是一个非常好的优点, 我们将使用三级继承结构来定制这个模板, 这将允许我们在三个不同层级修改模板, 方便自由定制。
主模板–level 1
<!– 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>
上面代码在引入了一个js文件, 在ie9版本前的浏览器中实现html, 以及两个css文件导入google fronts.
这构成了网页的主要内容结构, 相当于drupal的html.tpl.php+page.tpl.php.
让我们看一下头部文件
复制代码 代码如下:
{% 标签中即不是html, 也不是php, 他是3个Twig标签中的一个, 用于执行某些动作。 这里可以找到完整的Twig控制动作用于这个标签。 回到当前代码, 是用于查找title的block并输出他, 如果没有则输出默认的symblo这个词。
Twig的可续承特性可以用于修改title, 我们可以在其它模板文件中重写它:
{% extends '::base.html.twig' %}
{% block title %}The blog title goes here{% endblock %}
上面代码首先继承了第一次定义这个block的文件, 然后修改它。 网站标题部分会输出 'The blog title goes here – symfony'。
一般而言, 我们引用模板文件时会采用bundle:controller:template, 但是以上代码并没有bundle 和controller, 不包含这两个字段会直接引用app/Resources/views/ 文件夹下面的文件。
在css样式表中, 我们可以发现另一个Twig标签{{, 这是一个输出(说些什么)标签。
复制代码 代码如下:
这个标签用于输出变量或者表达式, 上面例子输出了asset函数的返回值, 这个函数提供可移植的方式来返回css,js, 图片的地址。
这个标签可以以特定格式输出我们想要内容, 比如时间:
复制代码 代码如下:{{ blog.created|date("d-m-Y") }}
全部过滤列表在 Twig 文档可以查到。
最后一个标签并没有在上述代码中出现, 它是{#, 只是一个注释标签
复制代码 代码如下:{# 注释内容可以输出在这里 #}
接下来我们将创建css样式表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; }
Bundler模板–level 2
现在我们为blog bundler 创建模板, 创建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 %}
非常简单的代码,1. 继承了一级模板, 并且为博客内容特别定制了侧边栏, 很显然我们并不想博客的布局与其它页面一样。 类似drupal7中page–content-type.tpl.php模板, 定制了某一特殊类型内容的布局。
具体页面布局–level 3
这个阶段已经涉及到创建具体页面, 所以需要先创建控制器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'); } }
然后创建相应的Twig文件: 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 %}
创建路由将首页引导到我们刚创建的页面: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
再次访问 http://symfony/app_dev.php可以看见简单的首页。
四、再创建一个about页面
路由:在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
当以get方式访问about页时执行位于BloggerBlogBundle命名空间的page控制器about动作。
控制器: 在src/Blogger/BlogBundle/Controller/PageController.php 于page控制器中加入about动作
复制代码 代码如下:
// src/Blogger/BlogBundle/Controller/PageController.php
// ..
public function aboutAction()
{
return $this->render('BloggerBlogBundle:Page:about.html.twig');
}
// ..
模板: 创建src/Blogger/BlogBundle/Resources/views/Page/about.html.twig 并加入相关页面文件
复制代码 代码如下:
{# src/Blogger/BlogBundle/Resources/views/Page/about.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}
{% block body %}
about page
{% endblock %}
简单的三个流程增加了关于页面:http://symfony/app_dev.php/about
希望本文所述对大家基于Symfony框架的PHP程序设计有所帮助。