Symfony2建立頁面執行個體詳解,symfony2執行個體詳解_PHP教程

來源:互聯網
上載者:User

Symfony2建立頁面執行個體詳解,symfony2執行個體詳解


本文執行個體講述了Symfony2建立頁面的方法。分享給大家供大家參考,具體如下:

在Symfony2中建立頁面只需要兩步:

1、建立路由:路由定義你頁面的URI(如/about)並指定要執行的控制器(PHP函數)。當傳入的請求URL匹配該路由時,Symfony2將執行指定的控制器;

2、建立控制器:控制器是一個PHP函數,它接受傳入的請求並將其轉換成Symfony2的Response對象。

我們喜歡這樣簡單的實現,因為它符合Web的工作方式。每一個Web互動都是由HTTP請求開始,應用程式的任務就是簡單地解釋請求並返回相應的HTTP響應。Symfony2遵循這一原則,並為你提供工具,以保證在應用程式的使用者和複雜性增長時仍保持良好地組織性。

“Hello Symfony2” 頁

讓我們從經典的“hello,world”程式開始,當我們完成後,使用者可以通過訪問下列URL來得到一聲問候:

http://localhost/app_dev.php/hello/Symfony

其實,你可以將Symfony換成其它的名稱來問候,要建立該頁,我們只需簡單地通過兩個步驟來進行:

本教程已經假定你下載了Symfony2,並且配置好了Web伺服器。上述URL假設localhost指向你新的Symfony2項目。安裝詳情參見安裝Symfony2。

建立Bundle

在開始之前,你需要建立一個Bundle。在Symfony2中,Bundle相當於外掛程式,你應用程式中的所有代碼都需要放在Bundle中。Bundle只是一個目錄(擁有PHP的名稱空間),裡面的內容都與某個特定功能相關(參見Bundle系統)。運行下列命令,建立AcmeStudyBundle(本章所建的遊戲之作)。

php app/console Acme/StudyBundle[/]

接下來,在app/autoloader.php檔案中添加了以下語句,以確保Acme名字空間被引導(參見自動載入章節):

$loader->registerNamespaces(array(  'Acme' => __DIR__.'/../src',  // ...));

最後在app/AppKernel.php檔案的registerBundles()方法中初始化Bundle。

// app/AppKernel.phppublic function registerBundles(){  $bundles = array(    // ...    new Acme\StudyBundle\AcmeStudyBundle(),  );  // ...  return $bundles;}

現在你已經設定好你的Bundle,並可以在你Bundle中構建你的應用程式了。

建立路由

預設狀態下,Symfony2的路由設定檔放置在app/config/routing.yml目錄中。在Symfony2中所有的設定檔也可以採用PHP或XML格式編寫。

# app/config/routing.ymlhomepage:  pattern: /  defaults: { _controller: FrameworkBundle:Default:index }hello:  resource: "@AcmeStudyBundle/Resources/config/routing.yml"

路由設定檔的前幾行定義了使用者請求”/”(首頁)資源所調用的代碼,更有趣的是最後一部分,它匯入了位於AcmeStudyBundle中的其它路由設定檔。

# src/Acme/StudyBundle/Resources/config/routing.ymlhello:  pattern: /hello/{name}  defaults: { _controller: AcmeStudyBundle:Hello:index }

路由由兩個基本部分組成,pattern(模式)確定哪個URI匹配本路由,defaults數組指定要啟動並執行控制器。在pattern中的預留位置{name}是個萬用字元,它表示諸如/hello/Ryan, /hello/Fabien或其他相似的URI匹配該路由。{name}佔位參數也被發送到控制器,以便我們可以使用它的值去問候使用者。

路由系統在建立應用程式強大、靈活的URL結構方面有著許多令人驚歎的功能,詳情請參見《Symfony2學習筆記之系統路由詳解》

建立控制器

當象/hello/Ryan這樣的URI被應用程式處理時,hello路由被匹配,並且AcmeStudyBundle:Hello:index控制器通過Symfony2架構被執行。建立頁面過程的第二步就是建立這個控制器

實際上控制器也不過是由你建立並通過Symfony2執行的PHP函數,這個定製的應用程式代碼使用請求資訊去構建和準備所需資源。除了一些進階案例外,控制器最終的輸出都是相同的:一個Response對象。

// src/Acme/StudyBundle/Controller/HelloController.phpnamespace Acme\StudyBundle\Controller;use Symfony\Component\HttpFoundation\Response;class HelloController{  public function indexAction($name)  {    return new Response('Hello '.$name.'!');  }}

控制器很簡單,它建立一個新的Response對象,該對象的第一個參數是它返回的響應內容(在本例中是個小小的HTML頁)。

恭喜你,僅僅只是在建立了一個路由和控制器之後,你就已經得到了一個全功能頁!如果你的設定沒有問題的話,你的應用程式就可以跟你打招呼了:

http://localhost/app_dev.php/hello/Ryan

一個可選但卻被經常用到的步驟就是建立一個模板。

在建立頁面時控制器是主入口和關鍵區段,更多資訊可以在控制器章節找到。

建立模板

模板允許你把所有的展示(如HTML代碼)都放到單個檔案中,並且重用頁面配置的不同區塊。下面代碼就是使用模板來替換控制器中的HTML代碼。

// src/Acme/StudyBundle/Controller/HelloController.phpnamespace 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));  }}

為了使用render()方法,你必須繼承Controller類,該類添加了一些常見任務的快捷方法。

render()方法建立一個Response對象,該對象使用特定的內容填充並通過模板渲染的。與其它控制器一樣,你最終得到的是一個Response對象。

注意,這裡有兩種不同渲染模板的例子,預設情況下,Symfony2支援兩種渲染模板的方式:傳統的PHP模板和簡潔強大的Twig模板。你可以隨意選擇使用其中的一種,也可以在同一項目中混用它們,這都不成問題。

控制器渲染AcmeStudyBundle:Hello:index.html.twig模板,該模板使用以下命名規範:

Bundle名:Controller名:Template名

在本例中,AcmeStudyBundle是Bundle名,Hello是控制器,index.html.twig是模板名。

{# src/Acme/StudyBundle/Resources/views/Hello/index.html.twig #}{% extends '::layout.html.twig' %}{% block body %}  Hello {{ name }}!{% endblock %}

讓我們一行行地來:
第2行:extends定義了一個父模板,模板明確定義了一個將被替換的布局檔案;
第4行:block表示其中的內容將會替換掉名為body的block,如我們所知,它在最終渲染時將負責layout.html.twig中名為body的block的渲染。
父模板::layout.html.twig省略了它的bundle名和控制器名(所以用兩個冒號::代替),這意味著該模板在bundle外面,在app目錄中。

{# app/Resources/views/layout.html.twig #}          {% block title %}Hello Application{% endblock %}        {% block body %}{% endblock %}  

基本模板檔案定義了HTML布局,並用我們在index.html.twig模板中定義的名為body的區塊渲染。這裡還定義了一個名為title的區塊,我們也可以選擇在index.html.twig模板中定義。由於我們沒有在子模板中定義title區塊,所以它還是使用預設值”Hello Application”。

模板在渲染和組織頁面內容方面的功能非常強大,它可以是HTML標識語言、CSS代碼或者控制器可能需要返回的東東。模板引擎只是達到目標的手段。每個控制器的目標是返回一個Response對象,模板雖然強大,但它卻是可選的,它只是為Response對象建立內容的工具而已。

目錄結構

經過前面幾段的學習,你已經理解了在Symfony2中建立和渲染頁面的步驟,也開始明白了Symfony2的組織和結構,在本章的最後,你將學會在哪兒找到和放置不同類型的檔案以及為什麼這樣做。

雖然Symfony2的目錄結構相當靈活,但在預設狀態下,Symfony2還是有著相同的、被推薦的基本目錄結構:

app/ : 該目錄包含應用程式配置;
src/ : 所有項目的PHP代碼都儲存在該目錄下;
vendor/ : 根據約定放置所有供應商的庫檔案;
web/ : 這是web根目錄,包括一些公眾可以訪問的檔案。

WEB目錄

web根目錄是所有靜態、公用檔案的家目錄,包括映像、樣式表和javascript檔案,這裡也是前端控制器所在的地方。

// web/app.phprequire_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();

前端控制器(在這裡是app.php)其實是一個PHP檔案,在使用Symfony2應用程式時執行。它的功能就是使用核心類AppKernel,讓應用程式自舉。
使用前端控制器意味著要比使用傳統的純PHP程式有著更為靈活多變的URL,當使用前端控制器時,URL格式如下所示:

http://localhost/app.php/hello/Ryan

前端控制器app.php被執行,URI(/hello/Ryan)通過路由配置被內部路由。如果使用Apache的重寫規則,你可以在不指定app.php的情況下強制執行它:

http://localhost/hello/Ryan

雖然前端控制器在處理請求時必不可少,但你很少會去修改甚至想到它,我們只是在環境一章中簡要地提及它。

應用程式(app)目錄

正如你在前端控制器所看到的那樣,AppKernel類是整個應用程式的主入口,它負責所有的配置,它被儲存在app/目錄中。

這個類必須實現三個方法,這些方法是Symfony2需要讓應用程式瞭解的。你甚至在一開始就無須擔心這些方法,因為Symfony2會智能地為你填充它們:

1、registerBundles(): 返回所有需要在應用程式中啟動並執行bundle數組 (參見Bundle系統 );
2、registerContainerConfiguration(): 引導應用程式的主配置資源檔 (參見應用程式配置章節);
3、registerRootDir(): 返回app根目錄 (預設是 app/)

在日常開發中,你會經常用到app/目錄,你會在app/config/目錄中修改配置和路由檔案(參見應用程式配置),也會使用app/cache/目錄做為應用程式的緩衝目錄、使用app/logs/目錄做為日誌目錄、使用app/Resources/目錄做為應用程式層級的資來源目錄。在下面的章節中你將會學到更多關於這些目錄的內容。

自動載入

當應用程式自舉時,將包含一個特殊的檔案:app/autoload.php。該檔案負責自動載入src/和vender/目錄中的所有檔案。

因為有自動載入器,你永遠無須為使用include或require語句擔心。Symfony2利用類的名稱空間確定它的位置,並自動載入包含你所需的類檔案。

$loader->registerNamespaces(array(  'Acme' => __DIR__.'/../src',  // ...));

在這個配置中,Symfony2將尋找src/目錄下Acme名稱空間(假想公司的名稱空間)的所有類。為了能夠自動載入,Class Name檔案和Path必須遵循同一模式:

Class Name:
Acme\StudyBundle\Controller\HelloController
Path:
src/Acme/StudyBundle/Controller/HelloController.php

app/autoload.php配置自動載入器在不同的目錄尋找不同的PHP名稱空間,也可以在必要時自訂。有關自動載入器的更多情況,參見如何自動載入類。

源(src)目錄

簡而言之,src/目錄包括所有在應用程式中啟動並執行PHP代碼。實際上在開發時,大部分工作都是在該目錄下完成的。預設情況下,src/目錄是空的,當你開始進行開發時,你將開始填充bundle所在的目錄,該目錄包含你應用程式的代碼。
然而bundle究竟是什麼呢?

Bundle系統

Bundle與其它軟體中的外掛程式類似,但比它們更好。關鍵的不同點在於在Symfony2中什麼都是bundle,包括架構的核心功能和你為應用程式所寫的代碼。在Symfony2中,Bundle是一類公民,這讓使用第三方Bundle的預建功能包或發布你自己的Bundle變得十分靈活。它也可以使你很容易地選擇應用程式所需功能,並用你自己的方式去最佳化它們。

Bundle簡單來說就是在一個目錄裡用來實現單一功能的結構化檔案集。你可以建立BlogBundle、ForumBundle或使用者管理的Bundle(許多都已經以開源Bundle的形式存在)。每個目錄都包含與功能相關的內容,如PHP檔案、模板、樣式表、Javascripts、測試等。每個Bundle都包含某種功能的方方面面,而每種功能都必須在Bundle中實現。

應用程式由在AppKernel類中的registerBundles()方法中定義的Bundle組成:

// app/AppKernel.phppublic 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;}

通過registerBundles()方法,你就擁有了應用程式所有Bundles的全部控制權(包含Symfony2的核心Bundle)

無論Bundle在什麼地方,它都可以被Symfony2自動載入。舉個例子,如果AcmeStudyBundle放在src/Acme目錄中,請確保Acme的名稱空間被添加到app/autoload.php檔案中,並映射到src/目錄,這樣它就可以被Symfony2自動載入了。

建立Bundle

為了向你展示Bundle系統是如何之簡單,讓我們建立一個名為AcmeTestBundle的新Bundle,並啟用它。

首先,建立一個src/Acme/TestBundle/ 目錄,並添加一個名為AcmeTestBundle.php的新檔案:

// src/Acme/TestBundle/AcmeTestBundle.phpnamespace Acme\TestBundle;use Symfony\Component\HttpKernel\Bundle\Bundle;class AcmeTestBundle extends Bundle{}

AcmeTestBundle遵循Bundle命名規範

這個空類僅僅只是我們需要建立新Bundle的一部分。雖然是空的,但這個類已經足夠強大,並能夠用來自訂Bundle的行為。

現在我們已經建立了我們的Bundle,我們需要通過Appkernel類啟用它:

// app/AppKernel.phppublic function registerBundles(){  $bundles = array(    // ...    // register your bundles    new Acme\TestBundle\AcmeTestBundle(),  );  // ...  return $bundles;}

雖然目前它還不能做任何事情,但AcmeTestBundle現在已經可以使用了。

同樣方便的是,Symfony也提供命令列介面去產生Bundle的基本架構

php app/console init:bundle "Acme\TestBundle" src

產生的Bundle架構套件括一個基本控制器、模板和可自訂的路由資源。接下來我們將會討論更多的Symfony2命令列工具。

無論何時,建立一個新的Bundle或使用第三方Bundle,都是需要確保該Bundle在registerBundles()中被啟用。

Bundle的目錄結構

Bundle的目錄結構是簡單而靈活的。預設狀態下,Bundle系統遵循Symfony2所有Bundle之間保持代碼一致性的約定集。讓我們看看AcmeStudyoverBundle,因為它包含了Bundle的大多數元素:

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的所有測試。

根據Bundle實現的功能,它可小可大,它只包含你所需要的檔案。

你在本書中還將學習到如何持久化對象到資料庫、建立和驗證表單、翻譯你的應用程式和編寫測試等等,它們在Bundle中都有自己的位置和所扮演的角色。

應用程式配置

應用程式由代表應用程式所有功能和特徵的Bundle集構成。每個Bundle都可以通過YAML、XML或PHP編寫的設定檔來自訂。預設情況下,主設定檔放置在app/config/目錄中,被命名為config.yml、config.xml或config.php,這取決於你所使用的格式:

# app/config/config.ymlframework:  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 Configurationtwig:  debug:      %kernel.debug%  strict_variables: %kernel.debug%

我們將在下一節環境中展示如何準確地選擇要引導的檔案/格式。

每一個頂級條目,如framework或twig都被配置成一個特定的Bundle。例如,framework被配置成Symfony2的核心FrameworkBundle,並包含路由、模板和其它核心系統的配置。

現在別擔心設定檔中各段中的特定配置選項,設定檔預設值都是合理的。當你瀏覽Symfony2的各部分時,你將學到每個部分的特定配置選項。

配置格式

縱觀整個章節,所有的配置樣本都用三種格式(YAML、XML和PHP)展示。它們每個都有自己的優缺點,以下是三種格式的說明:

1、YAML:簡單、乾淨和易讀
2、XML:有時比YAML更強大且支援IDE的自動完成
3、PHP:非常強大,但與標準配置格式相比易讀性差

環境

應用程式可以在不同的環境中運行。不同的環境共用相同的PHP代碼(由前端控制 器區分),但卻有著完全不同的配置。開發環境記錄警告和錯誤,而生產環境只記錄錯誤。在開發環境中一些檔案在每次請求之後被重構,而在生產環境中卻被緩衝 。所有的環境都在同一機制中生活。

雖然建立新的環境是容易的,但Symfony2項目通常會從三個環境開始(開發、測試和生產)。通過在你瀏覽器中改變前端控制器,你可以很方便地讓應用程式在不同的環境中切換。要將應用程式切換到開發環境,只需要通過開發前端控制器去訪問應用程式即可。

http://localhost/app_dev.php/hello/Ryan

如果你想看看你的應用程式在生產環境中的表現 ,可以調用生產前端控制器:

http://localhost/app.php/hello/Ryan

如果你開啟 web/app.php檔案,你將發現它已經很明確地被配置成使用生產環境:

$kernel = new AppCache(new AppKernel('prod', false));

你可以為一個新的環境建立一個新的前端控制器,只需要拷貝該檔案,並將prod修改成其它值。

因為生產環境是為速度最佳化的,配置、路由和Twig模板都被編譯成純的PHP類,同時被緩衝 。在生產環境中改變視圖時,你需要清除這些快取檔案,從而讓它們重構:

rm -rf app/cache/*

當進行自動化的測試時使用測試環境,它並不能從瀏覽器直接存取。參見測試章節以得到更多細節。

環境配置

AppKernel類負責載入你所選的設定檔:

// app/AppKernel.phppublic function registerContainerConfiguration(LoaderInterface $loader){  $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');}

我們已經知道.yml副檔名可以轉換成.xml或.php,只要你喜歡使用XML或PHP來寫配置。注意每種環境也可以載入它們自己的設定檔。下面是為生產環境準備的設定檔。

# app/config/config_dev.ymlimports:  - { resource: config.yml }framework:  router:  { resource: "%kernel.root_dir%/config/routing_dev.yml" }  profiler: { only_exceptions: false }web_profiler:  toolbar: true  intercept_redirects: truezend:  logger:    priority: debug    path:   %kernel.logs_dir%/%kernel.environment%.log

import關鍵詞與PHP格式中include語句一樣,都是首先引導主設定檔(config.yml),檔案的其它部分是為了增長的日誌和其它有利於開發環境的設定而對預設配置進行的調整。

在生產環境和測試環境都遵循同樣一個模型:每個環境匯入基本設定檔,然後修改它們的配置值去適應特殊環境的需要。

小結

恭喜你,你現在已經明白了Symfony2的基本原理,並驚喜地發現它是那樣的方便靈活。儘管有許多的功能,但我們可以牢記以下幾個基本點:

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)和設定檔,每種環境都可以被訪問。

希望本文所述對大家基於Symfony架構的PHP程式設計有所協助。

您可能感興趣的文章:

  • Symfony2聯集查詢實現方法
  • symfony2.4的twig中date用法分析
  • Symfony2之session與cookie用法小結
  • Symfony2實現從資料庫擷取資料的方法小結
  • Symfony2架構學習筆記之表單用法詳解
  • Symfony2學習筆記之外掛程式格式分析
  • Symfony2學習筆記之系統路由詳解
  • Symfony2學習筆記之控制器用法詳解
  • Symfony2學習筆記之模板用法詳解
  • Symfony2安裝第三方Bundles執行個體詳解
  • Symfony2函數用法執行個體分析

http://www.bkjia.com/PHPjc/1111903.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1111903.htmlTechArticleSymfony2建立頁面執行個體詳解,symfony2執行個體詳解 本文執行個體講述了Symfony2建立頁面的方法。分享給大家供大家參考,具體如下: 在Symfony2中建立頁面...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.