Symfony2框架創(chuàng)建項(xiàng)目與模板設(shè)置實(shí)例詳解
本文實(shí)例講述了Symfony2框架創(chuàng)建項(xiàng)目與模板設(shè)置的方法。分享給大家供大家參考,具體如下:
環(huán)境準(zhǔn)備與概覽
習(xí)慣于在windows使用netbean編輯器并使用virtualbox虛擬centos系統(tǒng), 預(yù)將nginx+php-fpm+mysql, 當(dāng)然apache也是不錯(cuò)的選擇, 使用http://symfony在windows與centos上作為開(kāi)發(fā)域名。
一、下載與環(huán)境設(shè)置
1. 如何于centos上面建立開(kāi)發(fā)環(huán)境不再詳述, 當(dāng)然也可以在windows上面建立開(kāi)發(fā)環(huán)境。
2. 關(guān)于使用 symfony代替127.0.0.1 在liunx系統(tǒng)中修改/etc/hosts文件, win7系統(tǒng)中修改 C:\Windows\System32\drivers\etc\host 文件(需要用管理員權(quán)限打開(kāi))
加入類似于IP 別名1 別名2的內(nèi)容即可, 如:
3.手動(dòng)下載symfony2, 也可以參照這個(gè)頁(yè)面用Composer 進(jìn)行安裝。http://symfony.com/doc/current/book/installation.html
唯一需要注意的是: app/cache 和app/logs目錄需要設(shè)置成777權(quán)限。windows的開(kāi)發(fā)環(huán)境應(yīng)該不存在這個(gè)問(wèn)題。
4. 修改apache 或者nginx配置文件symfony域名指向下載的symfony文件的web目錄。
此時(shí)應(yīng)該可以通過(guò) http://symfony/app_dev.php 訪問(wèn)到symfony的默認(rèn)頁(yè)面, 有幾個(gè)demo可以參照學(xué)習(xí)。
app_dev.php 默認(rèn)加載了一個(gè)開(kāi)發(fā)工具條在下面, 顯示了當(dāng)前頁(yè)面的一些信息, 極大地方便了程序的調(diào)試, 只有當(dāng)環(huán)境變量為dev時(shí)才會(huì)顯示。
5. 使用composer安裝時(shí), 會(huì)提示輸出mysql等相關(guān)信息, 需要修改這些信息, 或者是直接下載的文件, 可以進(jìn)入頁(yè)面的“Configure” 進(jìn)行相關(guān)設(shè)置。
Bundles(也許可以稱之為包, 束, 程序集,或者項(xiàng)目, 還是用英文吧)是symfony的基礎(chǔ)東東, 一個(gè)個(gè)分享出來(lái)可重復(fù)利用的代碼封裝, 甚至于symfony本身是作為一個(gè)bundles運(yùn)行的。 包括控制器、模塊、模板, 甚至于圖像與js, css樣式表等資源。 很雜亂的東西, 區(qū)別不同的bundles使用了php5.3以后的命名空間, 大部分cpenal, da虛擬主機(jī)好像只有php5.2版本吧, 無(wú)法運(yùn)行symfony2了。
二、創(chuàng)建一個(gè)Bundle
在下面的例子中將創(chuàng)建一個(gè)博客, Symfony 提供了大量工具來(lái)快速地創(chuàng)建項(xiàng)目。 比如我們可以用它來(lái)快速創(chuàng)建一個(gè)博客的基礎(chǔ)bundle.
運(yùn)行后直接采用所有的默認(rèn)設(shè)置即可。 可以方便地創(chuàng)建我們所需要的基本控制器, 模塊與模板等。 包含了下面的行為:
注冊(cè)Bundles
在symfony中所有使用的bundles都要求先被注冊(cè), 有些bundles只會(huì)使用于開(kāi)發(fā)測(cè)試環(huán)境(dev or test), 如前文提及的開(kāi)發(fā)工具條. 下面這斷代碼顯示了bundles創(chuàng)建命令如何注冊(cè)BloggerBlogBundle這個(gè)bundle.
// app/AppKernel.php class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // .. new Blogger\BlogBundle\BloggerBlogBundle(), ); // .. return $bundles; } // .. } }
路由
作為一個(gè)框架, 路由功能被bundler創(chuàng)建器創(chuàng)建于app/config/routing.yml, symfony是用yml格式來(lái)保存配置信息。
# app/config/routing.yml
BloggerBlogBundle:
resource: "@BloggerBlogBundle/Resources/config/routing.yml"
prefix: /
prefix前綴選項(xiàng)允許我們可以將其放置于如blog、news等子目錄下。
文件
除了以上配置文件外, 其它大部分文件生成為src目錄下, 如同大部分mvc框架。 在src下生成Blogger目錄, 并有BlogBundle子目錄存放著各種相關(guān)東東。不同的是類似于blogger的目錄對(duì)應(yīng)著php命名空間。
默認(rèn)控制器
Bundle生成器在src下面生成了默認(rèn)了控制器。 通過(guò)訪問(wèn): http://symfony/app_dev.php/hello/world 可以看到簡(jiǎn)單的問(wèn)候。 關(guān)于這個(gè)頁(yè)面是如何生成:
路由
還是路由, 不同的是前面的路由是在整個(gè)程序里面注冊(cè)使用, 這里的路由是控制具體頁(yè)面使用, src/Blogger/BlogBundle/Resources/config/routing.yml 控制了BloggerBlogBundle, 包含以下程序片斷:
# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_homepage:
pattern: /hello/{name}
defaults: { _controller: BloggerBlogBundle:Default:index }
參數(shù): 進(jìn)行url檢測(cè), 符合/hello/{name}結(jié)構(gòu)的任意值將被賦予給{name},
方式: 沒(méi)有對(duì)形式進(jìn)行限制, 理論可以put, get, post, delete所有的操作都可以進(jìn)行。
后續(xù): 如果符合以上兩條, 那么{name}將會(huì)傳導(dǎo)至特定文件, 以上為src/Blogger/BlogBundle/Controller/DefaultController.php文件中的default控制器的index行為將被使用。
控制器
在默認(rèn)生產(chǎn)的bundler中, 控制器行為相當(dāng)簡(jiǎn)單, {name}參數(shù)被傳入并被傳出到模板文件:
// 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 會(huì)使用 BloggerBlogBundle views文件夾中 Default文件夾下面index.html.twig模板文件.
模板文件
打開(kāi)上述模板文件, 非常簡(jiǎn)單的一句代碼:
{# src/Blogger/BlogBundle/Resources/views/Default/index.html.twig #} Hello {{ name }}!
以上就是symfony的整個(gè)mvc流程, 這么多文件的作用只是輸出一個(gè) “hello world”. 理論上不用bundler創(chuàng)建器, 只是手動(dòng)創(chuàng)建上述文件也可以實(shí)現(xiàn)相同效果?;ㄙM(fèi)的時(shí)間就多了去了。
回到正題, 我們是創(chuàng)建博客系統(tǒng), 所以不需要 hello world,
1.移除控制器 src/Blogger/BlogBundle/Controller/DefaultController.php
2.移除模板 src/Blogger/BlogBundle/Resources/views/Default/
3.最后移除路由 src/Blogger/BlogBundle/Resources/config/routing.yml
整個(gè)世界清靜了。
三、讓我們開(kāi)始創(chuàng)建博客的主頁(yè)
Twig的優(yōu)點(diǎn)
在symfony中我們可以使用 Twig和php(這不是廢話嘛)作為模板。使用Twig的以下優(yōu)點(diǎn):
1. 快: 是編繹過(guò)的php類, 可以占用更少的資源
2. 簡(jiǎn)潔:想想看要打<?php ?>, Twig輸入的內(nèi)容要少很多。
3. 可繼承: 非常cool的一個(gè)功能
4. 安全: 轉(zhuǎn)義功能默認(rèn)開(kāi)啟, 甚至還可以為重要代碼提供沙盒功能。
5. 可擴(kuò)展: 需要額外的定制功能, 可以隨時(shí)擴(kuò)展
更多內(nèi)容, 請(qǐng)移步:http://twig.sensiolabs.org/
可繼承是一個(gè)非常好的優(yōu)點(diǎn), 我們將使用三級(jí)繼承結(jié)構(gòu)來(lái)定制這個(gè)模板, 這將允許我們?cè)谌齻€(gè)不同層級(jí)修改模板, 方便自由定制。
主模板–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 rel='stylesheet' type='text/css'> <link 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 >Symfony2 博客教程</a> {% endblock %} </div> </section> {% block javascripts %}{% endblock %} </body> </html>
上面代碼在引入了一個(gè)js文件, 在ie9版本前的瀏覽器中實(shí)現(xiàn)html, 以及兩個(gè)css文件導(dǎo)入google fronts.
這構(gòu)成了網(wǎng)頁(yè)的主要內(nèi)容結(jié)構(gòu), 相當(dāng)于drupal的html.tpl.php+page.tpl.php.
讓我們看一下頭部文件
{% 標(biāo)簽中即不是html, 也不是php, 他是3個(gè)Twig標(biāo)簽中的一個(gè), 用于執(zhí)行某些動(dòng)作。 這里可以找到完整的Twig控制動(dòng)作用于這個(gè)標(biāo)簽。 回到當(dāng)前代碼, 是用于查找title的block并輸出他, 如果沒(méi)有則輸出默認(rèn)的symblo這個(gè)詞。
Twig的可續(xù)承特性可以用于修改title, 我們可以在其它模板文件中重寫它:
{% extends '::base.html.twig' %}
{% block title %}The blog title goes here{% endblock %}
上面代碼首先繼承了第一次定義這個(gè)block的文件, 然后修改它。 網(wǎng)站標(biāo)題部分會(huì)輸出 'The blog title goes here – symfony'。
一般而言, 我們引用模板文件時(shí)會(huì)采用bundle:controller:template, 但是以上代碼并沒(méi)有bundle 和controller, 不包含這兩個(gè)字段會(huì)直接引用app/Resources/views/ 文件夾下面的文件。
在css樣式表中, 我們可以發(fā)現(xiàn)另一個(gè)Twig標(biāo)簽{{, 這是一個(gè)輸出(說(shuō)些什么)標(biāo)簽。
這個(gè)標(biāo)簽用于輸出變量或者表達(dá)式, 上面例子輸出了asset函數(shù)的返回值, 這個(gè)函數(shù)提供可移植的方式來(lái)返回css,js, 圖片的地址。
這個(gè)標(biāo)簽可以以特定格式輸出我們想要內(nèi)容, 比如時(shí)間:
全部過(guò)濾列表在 Twig 文檔可以查到。
最后一個(gè)標(biāo)簽并沒(méi)有在上述代碼中出現(xiàn), 它是{#, 只是一個(gè)注釋標(biāo)簽
接下來(lái)我們將創(chuàng)建css樣式表web/css/screen.css , 加入以下內(nèi)容.
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
現(xiàn)在我們?yōu)閎log bundler 創(chuàng)建模板, 創(chuàng)建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 %}
非常簡(jiǎn)單的代碼,1. 繼承了一級(jí)模板, 并且為博客內(nèi)容特別定制了側(cè)邊欄, 很顯然我們并不想博客的布局與其它頁(yè)面一樣。 類似drupal7中page–content-type.tpl.php模板, 定制了某一特殊類型內(nèi)容的布局。
具體頁(yè)面布局–level 3
這個(gè)階段已經(jīng)涉及到創(chuàng)建具體頁(yè)面, 所以需要先創(chuàng)建控制器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'); } }
然后創(chuàng)建相應(yīng)的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 %}
創(chuàng)建路由將首頁(yè)引導(dǎo)到我們剛創(chuàng)建的頁(yè)面: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
再次訪問(wèn) http://symfony/app_dev.php可以看見(jiàn)簡(jiǎn)單的首頁(yè)。
四、再創(chuàng)建一個(gè)about頁(yè)面
路由:在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
當(dāng)以get方式訪問(wèn)about頁(yè)時(shí)執(zhí)行位于BloggerBlogBundle命名空間的page控制器about動(dòng)作。
控制器: 在src/Blogger/BlogBundle/Controller/PageController.php 于page控制器中加入about動(dòng)作
// src/Blogger/BlogBundle/Controller/PageController.php
// ..
public function aboutAction()
{
return $this->render('BloggerBlogBundle:Page:about.html.twig');
}
// ..
模板: 創(chuàng)建src/Blogger/BlogBundle/Resources/views/Page/about.html.twig 并加入相關(guān)頁(yè)面文件
{# src/Blogger/BlogBundle/Resources/views/Page/about.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}
{% block body %}
about page
{% endblock %}
簡(jiǎn)單的三個(gè)流程增加了關(guān)于頁(yè)面:http://symfony/app_dev.php/about
希望本文所述對(duì)大家基于Symfony框架的PHP程序設(shè)計(jì)有所幫助。
- Symfony查詢方法實(shí)例小結(jié)
- Symfony2聯(lián)合查詢實(shí)現(xiàn)方法
- Symfony2使用Doctrine進(jìn)行數(shù)據(jù)庫(kù)查詢方法實(shí)例總結(jié)
- 高性能PHP框架Symfony2經(jīng)典入門教程
- Symfony2實(shí)現(xiàn)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的方法小結(jié)
- Symfony2學(xué)習(xí)筆記之模板用法詳解
- Symfony2框架學(xué)習(xí)筆記之表單用法詳解
- symfony2.4的twig中date用法分析
- Symfony2學(xué)習(xí)筆記之控制器用法詳解
- Symfony2安裝第三方Bundles實(shí)例詳解
- Symfony2實(shí)現(xiàn)在controller中獲取url的方法
- Symfony2針對(duì)輸入時(shí)間進(jìn)行查詢的方法分析
相關(guān)文章
Symfony2使用Doctrine進(jìn)行數(shù)據(jù)庫(kù)查詢方法實(shí)例總結(jié)
這篇文章主要介紹了Symfony2使用Doctrine進(jìn)行數(shù)據(jù)庫(kù)查詢方法,結(jié)合實(shí)例形式總結(jié)分析了基于Doctrine的基本查詢、DQL及查詢生成器的基本實(shí)現(xiàn)方法,需要的朋友可以參考下2016-03-03PHP中使用strpos函數(shù)實(shí)現(xiàn)屏蔽敏感關(guān)鍵字功能
這篇文章主要介紹了PHP中使用strpos函數(shù)實(shí)現(xiàn)屏蔽敏感關(guān)鍵字功能,本文用在發(fā)布文章保存到數(shù)據(jù)庫(kù)時(shí)前攔截敏感關(guān)鍵,需要的朋友可以參考下2014-08-08Dwz與thinkphp整合下的數(shù)據(jù)導(dǎo)出到Excel實(shí)例
這篇文章主要介紹了Dwz與thinkphp整合下的數(shù)據(jù)導(dǎo)出到Excel的方法,是結(jié)合jQuery與ThinkPHP框架實(shí)現(xiàn)的導(dǎo)出Excel技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12Swoole?webSocket消息服務(wù)系統(tǒng)壓力測(cè)試解析
這篇文章主要為大家介紹了Swoole?webSocket消息服務(wù)系統(tǒng)壓力測(cè)試解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03