《PHP實戰(zhàn):Symfony2框架創(chuàng)建項目與模板設置實例詳解》要點:
本文介紹了PHP實戰(zhàn):Symfony2框架創(chuàng)建項目與模板設置實例詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
本文實例講述了Symfony2框架創(chuàng)建項目與模板設置的辦法.分享給大家供大家參考,具體如下:PHP應用
環(huán)境準備與概覽PHP應用
習慣于在windows使用netbean編輯器并使用virtualbox虛擬centos系統(tǒng), 預將nginx+php-fpm+mysql,? 當然apache也是不錯的選擇,?? 使用http://symfony在windows與centos上作為開發(fā)域名.PHP應用
一、下載與環(huán)境設置PHP應用
1. 如何于centos上面建立開發(fā)環(huán)境不再詳述, 當然也可以在windows上面建立開發(fā)環(huán)境.PHP應用
2. 關于使用 symfony代替127.0.0.1 在liunx系統(tǒng)中修改/etc/hosts文件, win7系統(tǒng)中修改 C:\Windows\System32\drivers\etc\host 文件(需要用管理員權限打開)PHP應用
加入類似于IP 別名1 別名2的內容即可, 如:PHP應用
3.手動下載symfony2, 也可以參照這個頁面用Composer 進行安裝.http://symfony.com/doc/current/book/installation.htmlPHP應用
唯一需要注意的是: app/cache 和app/logs目錄需要設置成777權限.windows的開發(fā)環(huán)境應該不存在這個問題.PHP應用
4. 修改apache 或者nginx配置文件symfony域名指向下載的symfony文件的web目錄.PHP應用
此時應該可以通過 http://symfony/app_dev.php 拜訪到symfony的默認頁面, 有幾個demo可以參照學習.PHP應用
PHP應用
app_dev.php 默認加載了一個開發(fā)工具條在下面, 顯示了當前頁面的一些信息, 極大地方便了程序的調試, 只有當環(huán)境變量為dev時才會顯示.PHP應用
5. 使用composer安裝時, 會提示輸出mysql等相關信息, 需要修改這些信息, 或者是直接下載的文件, 可以進入頁面的“Configure” 進行相關設置.PHP應用
Bundles(也許可以稱之為包, 束, 程序集,或者項目, 還是用英文吧)是symfony的基礎東東, 一個個分享出來可重復利用的代碼封裝, 甚至于symfony本身是作為一個bundles運行的.? 包括控制器、模塊、模板, 甚至于圖像與js, css樣式表等資源.?? 很雜亂的東西, 區(qū)別不同的bundles使用了php5.3以后的命名空間, 大部分cpenal, da虛擬主機好像只有php5.2版本吧, 無法運行symfony2了.PHP應用
二、創(chuàng)建一個BundlePHP應用
在下面的例子中將創(chuàng)建一個博客,? Symfony 提供了大量工具來快速地創(chuàng)建項目. 比如我們可以用它來快速創(chuàng)建一個博客的基礎bundle.PHP應用
運行后直接采用所有的默認設置即可. 可以方便地創(chuàng)建我們所需要的基本控制器, 模塊與模板等. 包含了下面的行為:PHP應用
注冊BundlesPHP應用
在symfony中所有使用的bundles都要求先被注冊, 有些bundles只會使用于開發(fā)測試環(huán)境(dev or test), 如前文提及的開發(fā)工具條. 下面這斷代碼顯示了bundles創(chuàng)建命令如何注冊BloggerBlogBundle這個bundle.PHP應用
// app/AppKernel.php class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // .. new Blogger\BlogBundle\BloggerBlogBundle(), ); // .. return $bundles; } // .. } }
路由PHP應用
作為一個框架, 路由功能被bundler創(chuàng)建器創(chuàng)建于app/config/routing.yml, symfony是用yml格式來保存配置信息.PHP應用
prefix前綴選項允許我們可以將其放置于如blog、news等子目錄下.
文件
除了以上配置文件外, 其它大部分文件生成為src目錄下, 如同大部分mvc框架. 在src下生成Blogger目錄, 并有BlogBundle子目錄存放著各種相關東東.不同的是類似于blogger的目錄對應著php命名空間.PHP應用
默認控制器PHP應用
Bundle生成器在src下面生成了默認了控制器. 通過拜訪: http://symfony/app_dev.php/hello/world 可以看到簡單的問候. 關于這個頁面是如何生成:PHP應用
路由PHP應用
還是路由, 不同的是前面的路由是在整個程序里面注冊使用, 這里的路由是控制具體頁面使用, src/Blogger/BlogBundle/Resources/config/routing.yml 控制了BloggerBlogBundle, 包含以下程序片斷:PHP應用
參數: 進行url檢測, 符合/hello/{name}結構的任意值將被賦予給{name},
方式: 沒有對形式進行限制, 理論可以put, get, post, delete所有的操作都可以進行.
后續(xù): 如果符合以上兩條, 那么{name}將會傳導至特定文件, 以上為src/Blogger/BlogBundle/Controller/DefaultController.php文件中的default控制器的index行為將被使用.PHP應用
控制器PHP應用
在默認生產的bundler中, 控制器行為相當簡單, {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)); } }
BloggerBlogBundle:Default:index.html.twig 會使用 BloggerBlogBundle views文件夾中 Default文件夾下面index.html.twig模板文件.PHP應用
模板文件PHP應用
打開上述模板文件, 非常簡單的一句代碼:PHP應用
{# src/Blogger/BlogBundle/Resources/views/Default/index.html.twig #} Hello {{ name }}!
以上就是symfony的整個mvc流程, 這么多文件的作用只是輸出一個 “hello world”. 理論上不用bundler創(chuàng)建器, 只是手動創(chuàng)建上述文件也可以實現(xiàn)相同效果.花費的時間就多了去了.PHP應用
回到正題, 我們是創(chuàng)建博客系統(tǒng), 所以不需要 hello world,PHP應用
1.移除控制器 src/Blogger/BlogBundle/Controller/DefaultController.php
2.移除模板 src/Blogger/BlogBundle/Resources/views/Default/
3.最后移除路由 src/Blogger/BlogBundle/Resources/config/routing.yml
整個世界清靜了.PHP應用
三、讓我們開始創(chuàng)建博客的主頁PHP應用
Twig的優(yōu)點PHP應用
在symfony中我們可以使用 Twig和php(這不是廢話嘛)作為模板.使用Twig的以下優(yōu)點:PHP應用
1. 快: 是編繹過的php類, 可以占用更少的資源PHP應用
2. 簡潔:想想看要打<?php ?>, Twig輸入的內容要少很多.PHP應用
3. 可繼承: 非常cool的一個功能PHP應用
4. 平安: 轉義功能默認開啟, 甚至還可以為重要代碼提供沙盒功能.PHP應用
5. 可擴展: 需要額外的定制功能, 可以隨時擴展PHP應用
更多內容, 請移步:http://twig.sensiolabs.org/PHP應用
可繼承是一個非常好的優(yōu)點, 我們將使用三級繼承結構來定制這個模板, 這將允許我們在三個不同層級修改模板, 方便自由定制.PHP應用
主模板Clevel 1PHP應用
<!C app/Resources/views/base.html.twig C> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html"; charset=utf-8" /> <title>{% block title %}symfony{% endblock %} C blog</title> <!C[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]C> {% 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>
上面代碼在引入了一個js文件, 在ie9版本前的瀏覽器中實現(xiàn)html, 以及兩個css文件導入google fronts.
這構成了網頁的主要內容結構, 相當于drupal的html.tpl.php+page.tpl.php.
讓我們看一下頭部文件PHP應用
{% 標簽中即不是html, 也不是php, 他是3個Twig標簽中的一個, 用于執(zhí)行某些動作. 這里可以找到完整的Twig控制動作用于這個標簽. 回到當前代碼, 是用于查找title的block并輸出他, 如果沒有則輸出默認的symblo這個詞.
Twig的可續(xù)承特性可以用于修改title, 我們可以在其它模板文件中重寫它:PHP應用
{% extends '::base.html.twig' %}
{% block title %}The blog title goes here{% endblock %}PHP應用
上面代碼首先繼承了第一次定義這個block的文件, 然后修改它. 網站標題部分會輸出 'The blog title goes here C symfony'.
一般而言, 我們引用模板文件時會采用bundle:controller:template, 但是以上代碼并沒有bundle 和controller, 不包含這兩個字段會直接引用app/Resources/views/ 文件夾下面的文件.PHP應用
在css樣式表中, 我們可以發(fā)現(xiàn)另一個Twig標簽{{, 這是一個輸出(說些什么)標簽.PHP應用
這個標簽用于輸出變量或者表達式, 上面例子輸出了asset函數的返回值, 這個函數提供可移植的方式來返回css,js, 圖片的地址.PHP應用
這個標簽可以以特定格式輸出我們想要內容, 比如時間:PHP應用
全部過濾列表在 Twig 文檔可以查到.PHP應用
最后一個標簽并沒有在上述代碼中出現(xiàn), 它是{#, 只是一個注釋標簽PHP應用
接下來我們將創(chuàng)建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; }
Bundler模板Clevel 2PHP應用
現(xiàn)在我們?yōu)閎log bundler 創(chuàng)建模板, 創(chuàng)建src/Blogger/BlogBundle/Resources/views/layout.html.twig 并加入:PHP應用
非常簡單的代碼,1. 繼承了一級模板, 并且為博客內容特別定制了側邊欄, 很顯然我們并不想博客的布局與其它頁面一樣. 類似drupal7中pageCcontent-type.tpl.php模板, 定制了某一特殊類型內容的布局.PHP應用
具體頁面布局Clevel 3PHP應用
這個階段已經涉及到創(chuàng)建具體頁面, 所以需要先創(chuàng)建控制器src/Blogger/BlogBundle/Controller/PageController.phpPHP應用
// 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)建相應的Twig文件: src/Blogger/BlogBundle/Resources/views/Page/index.html.twigPHP應用
創(chuàng)建路由將首頁引導到我們剛創(chuàng)建的頁面:src/Blogger/BlogBundle/Resources/config/routing.ymlPHP應用
再次拜訪 http://symfony/app_dev.php可以看見簡單的首頁.PHP應用
PHP應用
四、再創(chuàng)建一個about頁面PHP應用
路由:在src/Blogger/BlogBundle/Resources/config/routing.yml中加入PHP應用
當以get方式拜訪about頁時執(zhí)行位于BloggerBlogBundle命名空間的page控制器about動作.PHP應用
控制器: 在src/Blogger/BlogBundle/Controller/PageController.php 于page控制器中加入about動作PHP應用
模板: 創(chuàng)建src/Blogger/BlogBundle/Resources/views/Page/about.html.twig 并加入相關頁面文件PHP應用
簡單的三個流程增加了關于頁面:http://symfony/app_dev.php/aboutPHP應用
希望本文所述對大家基于Symfony框架的PHP程序設計有所贊助.PHP應用
歡迎參與《PHP實戰(zhàn):Symfony2框架創(chuàng)建項目與模板設置實例詳解》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7331.html