《PHP實例:Symfony2創建頁面實例詳解》要點:
本文介紹了PHP實例:Symfony2創建頁面實例詳解,希望對您有用。如果有疑問,可以聯系我們。
PHP應用本文實例講述了Symfony2創建頁面的辦法.分享給大家供大家參考,具體如下:
PHP應用在Symfony2中創建頁面只需要兩步:
PHP應用1、創建路由:路由定義你頁面的URI(如/about)并指定要執行的控制器(PHP函數).當傳入的哀求URL匹配該路由時,Symfony2將執行指定的控制器;
PHP應用2、創建控制器:控制器是一個PHP函數,它接受傳入的哀求并將其轉換成Symfony2的Response對象.
PHP應用我們喜歡這樣簡單的實現,因為它符合Web的工作方式.每一個Web交互都是由HTTP哀求開始,應用程序的任務就是簡單地解釋哀求并返回相應的HTTP響應.Symfony2遵循這一原則,并為你提供工具,以保證在應用程序的用戶和復雜性增長時仍保持良好地組織性.
PHP應用“Hello Symfony2” 頁
PHP應用讓我們從經典的“hello,world”程序開始,當我們完成后,用戶可以通過拜訪下列URL來得到一聲問候:
PHP應用
http://localhost/app_dev.php/hello/Symfony
PHP應用其實,你可以將Symfony換成其它的名稱來問候,要創建該頁,我們只需簡單地通過兩個步驟來進行:
PHP應用本教程已經假定你下載了Symfony2,并且配置好了Web服務器.上述URL假設localhost指向你新的Symfony2項目.安裝詳情參見安裝Symfony2.
PHP應用創建Bundle
PHP應用在開始之前,你需要創建一個Bundle.在Symfony2中,Bundle相當于插件,你應用程序中的所有代碼都需要放在Bundle中.Bundle只是一個目錄(擁有PHP的名稱空間),里面的內容都與某個特定功能相關(參見Bundle系統).運行下列命令,創建AcmeStudyBundle(本章所建的游戲之作).
PHP應用
php app/console Acme/StudyBundle[/]
PHP應用接下來,在app/autoloader.php文件中添加了以下語句,以確保Acme名字空間被引導(參見自動加載章節):
PHP應用
$loader->registerNamespaces(array(
'Acme' => __DIR__.'/../src',
// ...
));
PHP應用最后在app/AppKernel.php文件的registerBundles()辦法中初始化Bundle.
PHP應用
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new Acme\StudyBundle\AcmeStudyBundle(),
);
// ...
return $bundles;
}
PHP應用現在你已經設置好你的Bundle,并可以在你Bundle中構建你的應用程序了.
PHP應用創建路由
PHP應用缺省狀態下,Symfony2的路由配置文件放置在app/config/routing.yml目錄中.在Symfony2中所有的配置文件也可以采用PHP或XML格式編寫.
PHP應用
# app/config/routing.yml
homepage:
pattern: /
defaults: { _controller: FrameworkBundle:Default:index }
hello:
resource: "@AcmeStudyBundle/Resources/config/routing.yml"
PHP應用路由配置文件的前幾行定義了用戶哀求”/”(首頁)資源所調用的代碼,更有趣的是最后一部分,它導入了位于AcmeStudyBundle中的其它路由配置文件.
PHP應用
# src/Acme/StudyBundle/Resources/config/routing.yml
hello:
pattern: /hello/{name}
defaults: { _controller: AcmeStudyBundle:Hello:index }
PHP應用路由由兩個基本部分組成,pattern(模式)確定哪個URI匹配本路由,defaults數組指定要運行的控制器.在pattern中的占位符{name}是個通配符,它表示諸如/hello/Ryan, /hello/Fabien或其他相似的URI匹配該路由.{name}占位參數也被發送到控制器,以便我們可以使用它的值去問候用戶.
PHP應用路由系統在創建應用程序強大、靈活的URL結構方面有著許多令人驚嘆的功能,詳情請參見《Symfony2學習筆記之系統路由詳解》
PHP應用創建控制器
PHP應用當象/hello/Ryan這樣的URI被應用程序處理時,hello路由被匹配,并且AcmeStudyBundle:Hello:index控制器通過Symfony2框架被執行.創建頁面過程的第二步就是創建這個控制器
PHP應用實際上控制器也不過是由你創建并通過Symfony2執行的PHP函數,這個定制的應用程序代碼使用哀求信息去構建和準備所需資源.除了一些高級案例外,控制器最終的輸出都是相同的:一個Response對象.
PHP應用
// src/Acme/StudyBundle/Controller/HelloController.php
namespace Acme\StudyBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController
{
public function indexAction($name)
{
return new Response('<html><body>Hello '.$name.'!</body></html>');
}
}
PHP應用控制器很簡單,它創建一個新的Response對象,該對象的第一個參數是它返回的響應內容(在本例中是個小小的HTML頁).
PHP應用恭喜你,僅僅只是在創建了一個路由和控制器之后,你就已經得到了一個全功能頁!如果你的設置沒有問題的話,你的應用程序就可以跟你打招呼了:
PHP應用
http://localhost/app_dev.php/hello/Ryan
PHP應用一個可選但卻被經常用到的步驟就是創建一個模板.
PHP應用在創建頁面時控制器是主入口和關鍵部分,更多信息可以在控制器章節找到.
PHP應用創建模板
PHP應用模板允許你把所有的展示(如HTML代碼)都放到單個文件中,并且重用頁面布局的不同區塊.下面代碼就是使用模板來替換控制器中的HTML代碼.
PHP應用
// src/Acme/StudyBundle/Controller/HelloController.php
namespace Acme\StudyBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HelloController extends Controller
{
public function indexAction($name)
{
return $this->render('AcmeStudyBundle:Hello:index.html.twig', array('name' => $name));
// 渲染PHP模板
// return $this->render('AcmeStudyBundle:Hello:index.html.php', array('name' => $name));
}
}
PHP應用為了使用render()辦法,你必須繼承Controller類,該類添加了一些常見任務的快捷辦法.
PHP應用render()辦法創建一個Response對象,該對象使用特定的內容填充并通過模板渲染的.與其它控制器一樣,你最終得到的是一個Response對象.
PHP應用注意,這里有兩種不同渲染模板的例子,缺省情況下,Symfony2支持兩種渲染模板的方式:傳統的PHP模板和簡潔強大的Twig模板.你可以隨意選擇使用其中的一種,也可以在同一項目中混用它們,這都不成問題.
PHP應用控制器渲染AcmeStudyBundle:Hello:index.html.twig模板,該模板使用以下命名約定:
PHP應用Bundle名:Controller名:Template名
PHP應用在本例中,AcmeStudyBundle是Bundle名,Hello是控制器,index.html.twig是模板名.
PHP應用
{# src/Acme/StudyBundle/Resources/views/Hello/index.html.twig #}
{% extends '::layout.html.twig' %}
{% block body %}
Hello {{ name }}!
{% endblock %}
PHP應用讓我們一行行地來:
第2行:extends定義了一個父模板,模板明確定義了一個將被替換的布局文件;
第4行:block表示其中的內容將會替換掉名為body的block,如我們所知,它在最終渲染時將負責layout.html.twig中名為body的block的渲染.
父模板::layout.html.twig省略了它的bundle名和控制器名(所以用兩個冒號::代替),這意味著該模板在bundle外面,在app目錄中.
PHP應用
{# app/Resources/views/layout.html.twig #}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{% block title %}Hello Application{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
PHP應用基本模板文件定義了HTML布局,并用我們在index.html.twig模板中定義的名為body的區塊渲染.這里還定義了一個名為title的區塊,我們也可以選擇在index.html.twig模板中定義.由于我們沒有在子模板中定義title區塊,所以它還是使用缺省值”Hello Application”.
PHP應用模板在渲染和組織頁面內容方面的功能非常強大,它可以是HTML標識語言、CSS代碼或者控制器可能需要返回的東東.模板引擎只是達到目標的手段.每個控制器的目標是返回一個Response對象,模板雖然強大,但它卻是可選的,它只是為Response對象創建內容的工具罷了.
PHP應用目錄結構
PHP應用經過前面幾段的學習,你已經理解了在Symfony2中創建和渲染頁面的步驟,也開始明白了Symfony2的組織和結構,在本章的最后,你將學會在哪兒找到和放置不同類型的文件以及為什么這樣做.
PHP應用雖然Symfony2的目錄結構相當靈活,但在缺省狀態下,Symfony2還是有著相同的、被推薦的基本目錄結構:
PHP應用app/ : 該目錄包含應用程序配置;
src/ : 所有項目的PHP代碼都保存在該目錄下;
vendor/ : 根據約定放置所有供應商的庫文件;
web/ : 這是web根目錄,包括一些公眾可以拜訪的文件.
PHP應用WEB目錄
PHP應用web根目錄是所有靜態的、公共文件的家目錄,包括圖像、樣式表和javascript文件,這里也是前端控制器所在的地方.
PHP應用
// web/app.php
require_once __DIR__.'/../app/bootstrap.php';
require_once __DIR__.'/../app/AppKernel.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('prod', false);
$kernel->handle(Request::createFromGlobals())->send();
PHP應用前端控制器(在這里是app.php)其實是一個PHP文件,在使用Symfony2應用程序時執行.它的功能就是使用內核類AppKernel,讓應用程序自舉.
使用前端控制器意味著要比使用傳統的純PHP程序有著更為靈活多變的URL,當使用前端控制器時,URL格式如下所示:
PHP應用
http://localhost/app.php/hello/Ryan
PHP應用前端控制器app.php被執行,URI(/hello/Ryan)通過路由配置被內部路由.如果使用Apache的重寫規則,你可以在不指定app.php的情況下強制執行它:
PHP應用
http://localhost/hello/Ryan
PHP應用雖然前端控制器在處理哀求時必不可少,但你很少會去修改甚至想到它,我們只是在環境一章中簡要地提及它.
PHP應用應用程序(app)目錄
PHP應用正如你在前端控制器所看到的那樣,AppKernel類是整個應用程序的主入口,它負責所有的配置,它被保存在app/目錄中.
PHP應用這個類必須實現三個辦法,這些辦法是Symfony2需要讓應用程序了解的.你甚至在一開始就無須擔心這些辦法,因為Symfony2會智能地為你填充它們:
PHP應用1、registerBundles(): 返回所有需要在應用程序中運行的bundle數組 (參見Bundle系統 );
2、registerContainerConfiguration(): 引導應用程序的主配置資源文件 (參見應用程序配置章節);
3、registerRootDir(): 返回app根目錄 (缺省是 app/)
PHP應用在日常開發中,你會經常用到app/目錄,你會在app/config/目錄中修改配置和路由文件(參見應用程序配置),也會使用app/cache/目錄做為應用程序的緩存目錄、使用app/logs/目錄做為日志目錄、使用app/Resources/目錄做為應用程序級別的資源目錄.在下面的章節中你將會學到更多關于這些目錄的內容.
PHP應用自動加載
PHP應用當應用程序自舉時,將包含一個特殊的文件:app/autoload.php.該文件負責自動加載src/和vender/目錄中的所有文件.
PHP應用因為有自動加載器,你永遠無須為使用include或require語句擔心.Symfony2利用類的名稱空間確定它的位置,并自動加載包含你所需的類文件.
PHP應用
$loader->registerNamespaces(array(
'Acme' => __DIR__.'/../src',
// ...
));
PHP應用在這個配置中,Symfony2將查找src/目錄下Acme名稱空間(假想公司的名稱空間)的所有類.為了能夠自動加載,Class Name文件和Path必須遵循同一模式:
PHP應用Class Name:
??? Acme\StudyBundle\Controller\HelloController
Path:
??? src/Acme/StudyBundle/Controller/HelloController.php
PHP應用app/autoload.php配置自動加載器在不同的目錄查找不同的PHP名稱空間,也可以在必要時自定義.有關自動加載器的更多情況,參見如何自動加載類.
PHP應用源(src)目錄
PHP應用簡而言之,src/目錄包括所有在應用程序中運行的PHP代碼.實際上在開發時,大部分工作都是在該目錄下完成的.缺省情況下,src/目錄是空的,當你開始進行開發時,你將開始填充bundle所在的目錄,該目錄包含你應用程序的代碼.
然而bundle究竟是什么呢?
PHP應用Bundle系統
PHP應用Bundle與其它軟件中的插件類似,但比它們更好.關鍵的不同點在于在Symfony2中什么都是bundle,包括框架的核心功能和你為應用程序所寫的代碼.在Symfony2中,Bundle是一類公民,這讓使用第三方Bundle的預建功能包或發布你自己的Bundle變得十分靈活.它也可以使你很容易地選擇應用程序所需功能,并用你自己的方式去優化它們.
PHP應用Bundle簡單來說就是在一個目錄里用來實現單一功能的結構化文件集.你可以創建BlogBundle、ForumBundle或用戶管理的Bundle(許多都已經以開源Bundle的形式存在).每個目錄都包含與功能相關的內容,如PHP文件、模板、樣式表、Javascripts、測試等.每個Bundle都包含某種功能的方方面面,而每種功能都必須在Bundle中實現.
PHP應用應用程序由在AppKernel類中的registerBundles()辦法中定義的Bundle組成:
PHP應用
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
new Symfony\Bundle\AsseticBundle\AsseticBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
// register your bundles
new Acme\StudyBundle\AcmeStudyBundle(),
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
}
return $bundles;
}
PHP應用通過registerBundles()辦法,你就擁有了應用程序所有Bundles的全部控制權(包含Symfony2的核心Bundle)
PHP應用無論Bundle在什么地方,它都可以被Symfony2自動加載.舉個例子,如果AcmeStudyBundle放在src/Acme目錄中,請確保Acme的名稱空間被添加到app/autoload.php文件中,并映射到src/目錄,這樣它就可以被Symfony2自動加載了.
PHP應用創建Bundle
PHP應用為了向你展示Bundle系統是如何之簡單,讓我們創建一個名為AcmeTestBundle的新Bundle,并激活它.
PHP應用首先,創建一個src/Acme/TestBundle/ 目錄,并添加一個名為AcmeTestBundle.php的新文件:
PHP應用
// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeTestBundle extends Bundle
{
}
PHP應用AcmeTestBundle遵循Bundle命名約定
PHP應用這個空類僅僅只是我們需要創建新Bundle的一部分.雖然是空的,但這個類已經足夠強大,并能夠用來自定義Bundle的行為.
PHP應用現在我們已經創建了我們的Bundle,我們需要通過Appkernel類激活它:
PHP應用
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
// register your bundles
new Acme\TestBundle\AcmeTestBundle(),
);
// ...
return $bundles;
}
PHP應用雖然目前它還不能做任何事情,但AcmeTestBundle現在已經可以使用了.
PHP應用同樣方便的是,Symfony也提供命令行接口去生成Bundle的基本框架
PHP應用
php app/console init:bundle "Acme\TestBundle" src
PHP應用生成的Bundle框架包括一個基本控制器、模板和可自定義的路由資源.接下來我們將會討論更多的Symfony2命令行工具.
PHP應用無論何時,創建一個新的Bundle或使用第三方Bundle,都是需要確保該Bundle在registerBundles()中被激活.
PHP應用Bundle的目錄結構
PHP應用Bundle的目錄結構是簡單而靈活的.缺省狀態下,Bundle系統遵循Symfony2所有Bundle之間保持代碼一致性的約定集.讓我們看看AcmeStudyoverBundle,因為它包含了Bundle的大多數元素:
PHP應用1、Controller/目錄:包含該Bundle的控制器(如:HelloController.php);
2、Resources/config/目錄:配置目錄,包括路由配置(如:routing.yml);
3、Resources/views/目錄:通過控制器名組織的模板(如:Hello/index.html.twig);
4、Resources/public/目錄:包含web資源(圖片、樣式表等),并被拷貝或軟鏈接到項目的web/目錄;
5、Tests/目錄:存放該Bundle的所有測試.
PHP應用根據Bundle實現的功能,它可小可大,它只包含你所需要的文件.
PHP應用你在本書中還將學習到如何持久化對象到數據庫、創建和驗證表單、翻譯你的應用程序和編寫測試等等,它們在Bundle中都有自己的位置和所飾演的角色.
PHP應用應用程序配置
PHP應用應用程序由代表應用程序所有功能和特征的Bundle集構成.每個Bundle都可以通過YAML、XML或PHP編寫的配置文件來自定義.缺省情況下,主配置文件放置在app/config/目錄中,被命名為config.yml、config.xml或config.php,這取決于你所使用的格式:
PHP應用
# app/config/config.yml
framework:
charset: UTF-8
secret: xxxxxxxxxx
form: true
csrf_protection: true
router: { resource: "%kernel.root_dir%/config/routing.yml" }
validation: { annotations: true }
templating: { engines: ['twig'] } #assets_version: SomeVersionScheme
session:
default_locale: en
lifetime: 3600
auto_start: true
# Twig Configuration
twig:
debug: %kernel.debug%
strict_variables: %kernel.debug%
PHP應用我們將在下一節環境中展示如何準確地選擇要引導的文件/格式.
PHP應用每一個頂級條目,如framework或twig都被配置成一個特定的Bundle.例如,framework被配置成Symfony2的核心FrameworkBundle,并包含路由、模板和其它核心系統的配置.
PHP應用現在別擔心配置文件中各段中的特定配置選項,配置文件缺省值都是合理的.當你瀏覽Symfony2的各部分時,你將學到每個部分的特定配置選項.
PHP應用配置格式
PHP應用縱觀整個章節,所有的配置示例都用三種格式(YAML、XML和PHP)展示.它們每個都有自己的優缺點,以下是三種格式的說明:
PHP應用1、YAML:簡單、干凈和易讀
2、XML:有時比YAML更強大且支持IDE的自動完成
3、PHP:非常強大,但與標準配置格式相比易讀性差
PHP應用環境
PHP應用應用程序可以在不同的環境中運行.不同的環境共享相同的PHP代碼(由前端控制 器區分),但卻有著完全不同的配置.開發環境記錄警告和錯誤,而生產環境只記錄錯誤.在開發環境中一些文件在每次哀求之后被重構,而在生產環境中卻被緩存 .所有的環境都在同一機制中生活.
PHP應用雖然創建新的環境是容易的,但Symfony2項目通常會從三個環境開始(開發、測試和生產).通過在你瀏覽器中改變前端控制器,你可以很方便地讓應用程序在不同的環境中切換.要將應用程序切換到開發環境,只需要通過開發前端控制器去拜訪應用程序即可.
PHP應用
http://localhost/app_dev.php/hello/Ryan
PHP應用如果你想看看你的應用程序在生產環境中的表現 ,可以調用生產前端控制器:
PHP應用
http://localhost/app.php/hello/Ryan
PHP應用如果你打開 web/app.php文件,你將發現它已經很明確地被配置成使用生產環境:
PHP應用
$kernel = new AppCache(new AppKernel('prod', false));
PHP應用你可以為一個新的環境創建一個新的前端控制器,只需要拷貝該文件,并將prod修改成其它值.
PHP應用因為生產環境是為速度優化的,配置、路由和Twig模板都被編譯成純的PHP類,同時被緩存 .在生產環境中改變視圖時,你需要清除這些緩存文件,從而讓它們重構:
PHP應用
rm -rf app/cache/*
PHP應用當進行自動測試時使用測試環境,它并不能從瀏覽器直接拜訪.參見測試章節以得到更多細節.
PHP應用環境配置
PHP應用AppKernel類負責加載你所選的配置文件:
PHP應用
// app/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
PHP應用我們已經知道.yml擴展名可以轉換成.xml或.php,只要你喜歡使用XML或PHP來寫配置.注意每種環境也可以加載它們自己的配置文件.下面是為生產環境準備的配置文件.
PHP應用
# app/config/config_dev.yml
imports:
- { resource: config.yml }
framework:
router: { resource: "%kernel.root_dir%/config/routing_dev.yml" }
profiler: { only_exceptions: false }
web_profiler:
toolbar: true
intercept_redirects: true
zend:
logger:
priority: debug
path: %kernel.logs_dir%/%kernel.environment%.log
PHP應用import關鍵詞與PHP格式中include語句一樣,都是首先引導主配置文件(config.yml),文件的其它部分是為了增長的日志和其它有利于開發環境的設置而對缺省配置進行的調整.
PHP應用在生產環境和測試環境都遵循同樣一個模型:每個環境導入基本配置文件,然后修改它們的配置值去適應特殊環境的需要.
PHP應用小結
PHP應用恭喜你,你現在已經明白了Symfony2的基本原理,并驚喜地發現它是那樣的方便靈活.盡管有許多的功能,但我們可以牢記以下幾個基本點:
PHP應用1、創建頁面需要三個步驟,包括路由、控制器和模板(可選);
2、每個應用程序都應該包含四個目錄:web/(web資源和前端控制器)、app/(配置)、src/(你的Bundle)和vendor/(第三方代碼);
3、Symfony2的每個功能(包括Symfony2框架核心)都被組織進一個Bundle,Bundle是該功能的結構化文件集;
4、每個Bundle的配置都存放在app/config目錄中,可以使用YAML、XML和PHP編寫;
5、通過不同的前端控制器(如:app.php或app_dev.php)和配置文件,每種環境都可以被拜訪.
PHP應用希望本文所述對大家基于Symfony框架的PHP程序設計有所贊助.
歡迎參與《PHP實例:Symfony2創建頁面實例詳解》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7309.html