《PHP實戰:Symfony頁面的基本創建實例詳解》要點:
本文介紹了PHP實戰:Symfony頁面的基本創建實例詳解,希望對您有用。如果有疑問,可以聯系我們。
本文實例分析了Symfony頁面的基本創建辦法.分享給大家供大家參考.具體如下:PHP應用
這里我們將會學習如何創建一個模塊,這是組織頁面的結構化元素.同時我們也會學習如何創創建一個分為一個動作也一個模板的頁面,之所以分為動作與模板,是因為MVC模式.鏈接與表彰是基本的頁面交互,我們將會學習如安在模板中插入這些元素并且在動作中進行處理.PHP應用
創建一個模塊框架PHP應用
Symfony將頁面組織為模塊.在創建一個頁面之前,我們需要創建一個模塊,并且初始化為一個Symfony可以識別的文件結構的空殼.PHP應用
Symfony命令行自動化處理模塊的創建.我們只需要調用init-module任務,并且使用程序名以及模塊名作為參數.在創建了一個myapp程序之后,要向這個程序中添加一個mymodule模塊,我們可以輸入下面的命令:
PHP應用
>> dir+????? ~/myproject/apps/myapp/modules/mymodule
>> dir+????? ~/myproject/apps/myapp/modules/mymodule/actions
>> file+???? ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php
>> dir+????? ~/myproject/apps/myapp/modules/mymodule/config
>> dir+????? ~/myproject/apps/myapp/modules/mymodule/lib
>> dir+????? ~/myproject/apps/myapp/modules/mymodule/templates
>> file+???? ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php
>> dir+????? ~/myproject/apps/myapp/modules/mymodule/validate
>> file+???? ~/myproject/test/functional/myapp/mymoduleActionsTest.php
>> tokens??? ~/myproject/test/functional/myapp/mymoduleActionsTest.php
>> tokens??? ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php
>> tokens??? ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.phpPHP應用
與actions/,config/,lib/,templates/,validate/目錄相分離,這個命令只創建三個文件.位于test/目錄中的一個為單元測試.actions.class.php指向默認的模塊歡迎頁面.templates/indexSuccess.php文件為空.PHP應用
在actions/actions.class.php文件中默認生成的動作:
PHP應用
除了命令行,Symfony還提供了其他的辦法來初始化一個模塊.其中一個辦法就是手動來創建目錄與文件.在許多情況下,一個模塊的動作與模板就意味著操作一個給定數據表的數據.因為創建,獲取,更新,以及從一個數據表中刪除數據記錄的必須代碼通常都是相同的,Symfony提供了一個名為框架的機制來我們生成這些代碼.我們后續會繼續介紹.PHP應用
添加一個頁面PHP應用
在Symfony中,頁面后面的邏輯存儲在動作中,而表面則是在模板中.沒有邏輯的頁面仍然需要一個空的動作.PHP應用
添加一個動作PHP應用
"Hello,world!"頁面則會通過一個myAction的動作進行拜訪.要創建這個動作,只需要在mymoduleActions類中添加一個executeMyAction方法,如下所示:
PHP應用
動作辦法的名字總是execute'Xxx'()的形式,其中名字的第二部分是動作的名字,并且第一個字母大寫.PHP應用
現在我們可以哀求下面的URL:
http://localhost/myapp_dev.php/mymodule/myActionPHP應用
Symfony將會抱怨丟失了myActionSuccess.php模板.這是正常的.在Symfony中,一個頁面通常是由一個動和與一個模板組成的.PHP應用
URL是響應的一部分PHP應用
Symfony包含一個路由系統允許我們在實際的動作名與需要調用的URL格式之間有一個完整的分隔.這允許自定義URL的自定義格式,就如同他是響應的一部分.我們不再為文件的結構或是哀求的參數據限制,一個動作的URL看起來就我們所希望的解析.例如,到一個名為article模塊的索引動作調用通常如下面的樣子:
http://localhost/myapp_dev.php/article/index?id=123PHP應用
這個URL由一個數據獲取一篇指定的文章.但是URL可以通過在routingyml配置文件中作一些小的改動而以一種完全不同的方式進行編寫:
http://localhost/articles/europe/france/finance.htmlPHP應用
這樣的URL不僅對于搜索引擎友好的,他對于用戶來說也是十分重要的,這樣用戶就可以將地址欄作為一個偽碼命令來自定義查詢,例如下面的例子:
http://localhost/articles/tagged/finance+france+euroPHP應用
Symfony知道如何為用戶解析并生成URL.路由系統會自動從一個簡潔URL中脫去所哀求的參數,并使其為動作可用.他同時也會格式化響應中所包含的超鏈接,從而使其看起來更為簡潔.我們將會在第九章了解這個特性的更多內容.PHP應用
總之,這就意味著我們命名程序的動作的方式不應受到調用他們的URL的樣子的影響,而是受程序中動作的函數控制.一個動作的名了解釋了動作實際所做的內容,而且通常為不定式格式中的一個動詞(例如show,list,edit).動作的名字可以做到對于終端用戶完全不可見,從而不必擔心使用顯式的動作名.我們可以有效的利用代碼注釋來解釋我們的函數功能,從而使代碼更讀.PHP應用
添加一個模板PHP應用
動作需要一個模板來進行封裝.一個模板就是位于一個模塊的templates/目錄的一個文件,通常是以動作和動作的詞尾來進行命名的.默認的動作詞尾為"success",所以為myAction動作所創建的模板文件應命名為myActionSuccess.php.PHP應用
模板只包含表現代碼,所以在其中要包含盡可有少的PHP代碼.實際上,一個顯示"Hello,world!"的頁面只有一行的代碼的模板.
PHP應用
如果我們需要在模板中運行一些PHP代碼,我們應避免使用下面所列的通常的PHP語法.相反,應使用另一種PHP語法來編寫我們的模板,從而使得代碼對于非PHP程序來說更易于理解.不僅最終代碼是正確的,而且有助于我們在動作中保持復雜的PHP代碼,因為只有控制語句有對應代碼.PHP應用
通常的PHP語法如下:
PHP應用
替代的PHP語法如下:
PHP應用
動作的工作是要完成所有復雜的計算,數據讀取以及測試,并且設置要輸出或是測試的模板變量.Symfony使得動作類的屬性在全局名字空間中為模板可用.下面顯示如何由動作向模板傳遞信息.PHP應用
在動作中設置動作屬性從而使其為模板可用:
PHP應用
模板直接拜訪動作屬性:
PHP應用
模板已經可以訪問一些數據,而不需要在動作中設置任何變量.每一個模板通常可以調用$sf_context,$sf_request,$sf_params,$sf_user對象的方法.他們包含與當前內容,哀求,哀求參數以及會話相關的數據.我們很快就會學到他們的用法.PHP應用
使用表單向用戶收集信息PHP應用
表單是向用戶收集信息的一個好辦法.使用HTML編寫表單以及表單元素有時是相當麻煩的,尤其是當我們希望適用于XTHML時更是如此.我們可以用通常的方式在Symfony模板中包含表單元素,如下面所示,但是Symfony提供了幫助器從而使得這個任務更為簡單.PHP應用
模板可以包含通常的HTML代碼:
PHP應用
一個贊助器是用在模板中的由Symfony定義的PHP函數.他輸出HTML代碼,并且比我們自己編寫實際的HTML代碼要快速得多.使用Symfony贊助器,我們用下面的代碼得到的輸出結果與上面通常的HTML代碼相同:
PHP應用
如果在上面的代碼中,我們認為使用贊助器的版本并不會比編寫HTML代碼快,那么我們可以考慮一下下面的情況:
PHP應用
這會得到下面的HTML輸出結果:
PHP應用
在模板中使用的贊助器的好處就在于加快了編碼的速度,代碼的清晰與簡潔.而代價就是我們需要花費時進行學習.所以我們可以在模板中不使用Symfony贊助器,并且以我們通常的方式來編寫代碼,但是這會是一個巨大的損失.PHP應用
注意,短開放標記的用法(<?=,等同于<?php echo)并不推薦在專業的web程序中使用,因為我們的web服務器也許會理解多個腳本語言,從而會使其變得迷惑.另外,短開放標記并不會與默認的PHP配置進行工作,而且需要修改服務來激活.最后,當我們必須處理XML與驗證時,他會出錯,因為<?在XML中有著特殊的意義.PHP應用
表單處理有專門的一章進行討論,因為Symfony提供了許多工具,絕大數的贊助器,來使其簡單.我們將會在第10章了解到關于贊助器更多的內容.PHP應用
鏈接到另一個動作PHP應用
我們現在已經知道在動作名字與需要調用的URL之間有一個分離.所以我們使用下面的方式來創建到另一個動作的鏈接時,他只會工作在默認的路由系統中.如果我們以后決定改變URL的樣子,那么我們就需要查看所有的模板來改變超鏈接.PHP應用
超鏈接,通常的辦法:
PHP應用
要避免這樣的麻煩,我們應總是使用link_to()贊助器來我們的程序動作創建超鏈接.下面的例子演示了超鏈接贊助器的用法.PHP應用
link_to()贊助器:
PHP應用
生成的HTML與前面的相同,所不同的就在于當我們改變我們的路由規則時,所有的模板都會正確工作,并且重新格式化URL.PHP應用
link_to()贊助器,就像其他的贊助器,會接受特定選項的額外參數和額外的標簽屬性.下面的例子顯示了一個可選參數以及生成的HTML.選項參數或者是一個相關的數組或者是由空格分隔的顯示key=value的簡單字符串.PHP應用
大多數贊助器接收一個可選參數:
PHP應用
任何時候我們使用一個Symfony贊助器來輸出一個HTML標記時,我們可以在可選參數中插入額外的標記屬性.我們可以使用HTML 4.0的方式來編寫這樣的屬性,而Symfony將會以更簡潔的格式進行輸出.這也就是為什么贊助器會比HTML更容易編寫的原因.PHP應用
因為他需要一個額外的分析與轉換,字符串語法比數組語法要慢一些.PHP應用
與表單贊助器相類似,鏈接贊助器有更多的數量和選項.PHP應用
由哀求得到信息PHP應用
無論用戶通過表單發送信息(通常以POST哀求的方式)還是通過URL(GET哀求),我們可以通過帶有sfActions對象的getRequestParameter()方法的動作來獲取數據.下面的例子顯示如何在anotherAction中得到name參數的值.PHP應用
在動作中由哀求參數得到數據:
PHP應用
如果數據的處理是簡單的,我們甚至并不需要使用動作來得到哀求參數.模板可以訪問一個名為$sf_params的對象,他提供了get()方法來得到哀求參數,就如同動作中的getRequestParameter()方法.PHP應用
如果executeAnotherAction()辦法是空的,下面的例子顯示了anotherActionSuccess.php模板文件如何得到同樣的name參數.PHP應用
在模板中直接由哀求參數得到數據:
PHP應用
那么為什么不使用$_POST,$_GET或是$_REQUEST變量呢?因為我們的URL將會不同的方式進行格式化(http://localhost/articles/europe/france/finance.html),這樣通常的PHP變量就會再起作用,并且只有路由系統可以得到哀求參數.而我們希望添加輸入過濾來阻止惡意代碼注入,而這只有當我們將所有的哀求參數保存在一個簡潔的參數裝配器中才可能.PHP應用
$sf_params對象比僅提供一個與數組等同的方法要強大得多.例如,如果我們只是希望檢測一個哀求參數是否存在,我們可以簡單的使用$sf_params->has()方法,而不使用get()測試實際的值.PHP應用
在模板中測試哀求參數的存在:
PHP應用
我們已經猜到了,這可以在單一的代碼行中編寫.與Symfony中大多數的獲取方法一樣,動作中的getRequestParameter()方法與模板中的$sf_params->get()(實際上調用同一個對象的相同主法)方法接受第二個參數:如果沒有提供哀求參數則使用默認值:
PHP應用
總結PHP應用
在Symfony中,頁面是由一個動作(actions/actions.class.php文件中以execute為前綴的一個方法)和一個模板(templates/目錄下的一個文件,通常以Success.php結尾)組成的.他們通地在程序中的函數組織在一個模塊中.編寫模板是由幫助器來完成的,而幫助器則是由Symfony提供的返回HTML代碼的函數.而我們需要將URL看作響應的一部分,而URL在需要可以格式化,所以我們應避免在動作命名中使用到URL的直接引用或者是哀求參數檢索.PHP應用
一旦我們知道了這些基本原則,我們就可以使用Symfony來編寫一個完整的Web程序了.但是我們的路還有很長,因為我們在程序開發過程需要處理的每一個任務由一些Symfony特性來完成的.PHP應用
希望本文所述對大家的symfony框架程序設計有所贊助.PHP應用
歡迎參與《PHP實戰:Symfony頁面的基本創建實例詳解》討論,分享您的想法,維易PHP學院為您提供專業教程。