成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

第04章 建立頁(yè)面的基礎(chǔ)知識(shí)

第4章 建立頁(yè)面的基礎(chǔ)知識(shí)很奇怪,每次學(xué)習(xí)新語(yǔ)言或者框架的第一個(gè)例子都是在屏幕上顯示"Hello, world!"。目前為止所有利用人工智能來(lái)實(shí)現(xiàn)交談的嘗試的結(jié)果都很差,所以電腦能問(wèn)候整個(gè)世界這種想

第4章 建立頁(yè)面的基礎(chǔ)知識(shí)

很奇怪,每次學(xué)習(xí)新語(yǔ)言或者框架的第一個(gè)例子都是在屏幕上顯示"Hello, world!"。目前為止所有利用人工智能來(lái)實(shí)現(xiàn)交談的嘗試的結(jié)果都很差,所以電腦能問(wèn)候整個(gè)世界這種想法實(shí)在有些古怪。但是symfony 并不比其他程序笨,證據(jù)是,你可以用symfony 創(chuàng)建一個(gè)說(shuō)"Hello, <你的名字>"的頁(yè)面。

本章會(huì)告訴你如何創(chuàng)建一個(gè)模塊,也就是一組頁(yè)面的集合體。你還將了解到如何建立一個(gè)頁(yè)面,由于MVC,頁(yè)面由一個(gè)動(dòng)作和一個(gè)模板構(gòu)成。鏈接和表單是web 交互的基礎(chǔ),你將在這一章了解如何在模板里增加他們,如何用動(dòng)作處理他們。建立模塊框架

在第二章中我們介紹過(guò),symfony把頁(yè)面組織成模塊。建立頁(yè)面之前,你必須先建立一個(gè)模塊,也就是一個(gè)symfony 能識(shí)別的目錄結(jié)構(gòu)的一個(gè)空殼。symfony 命令行工具能自動(dòng)建立模塊。你只需要用symfony 命令行工具執(zhí)行init-module 任務(wù)并傳應(yīng)用程序名與模塊名這兩個(gè)參數(shù)給它就可以了。在前一章里,你建立了myapp 應(yīng)用程序。如果要在這個(gè)應(yīng)用程序里增加一個(gè)mymodule 模塊,只需要在命令行下輸入下面的命令:

> cd ~/myproject

> symfony init-module myapp mymodule

>> 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.php除了actions/, config/, lib/, templates/, 與 validate/目錄,這條命令只建立了三個(gè)文件。test/目錄里的文件與單元測(cè)試有關(guān),在第15章之前你都不用管它。actions.class.php(見(jiàn)例4-1)做了一個(gè)到默認(rèn)模塊的成功頁(yè)面的跳轉(zhuǎn)。templates/indexSuccess.php文件是空的。

例 4-1 - 默認(rèn)的自動(dòng)生成的動(dòng)作 actions/actions.class.php

class mymoduleActions extends sfActions

{

public function executeIndex()

{

$this->forward('default', 'module');

}

}

NOTE 如果你看一下實(shí)際的actions.class.php 文件,你會(huì)注意到除了上面的這幾行之外還有其他的內(nèi)容,包括一些注釋。這是因?yàn)閟ymfony 推薦使用P H P 注釋來(lái)為你的項(xiàng)目生成文檔,所以每個(gè)類(lèi)文件都與php D ocumentor 工具

() 兼容。

symfony 為每一個(gè)新模塊建立一個(gè)index 動(dòng)作。它是由一個(gè)execueIndex 的方法與一個(gè)叫indexSuccess.php 的模板組成的。execute 前綴與Success 后綴的含義會(huì)在第6章與第7章中分別解釋。現(xiàn)在你可以認(rèn)為這是一種命名習(xí)慣。在瀏覽器中輸入下面的網(wǎng)址就可以看到這個(gè)頁(yè)面(圖4-1):

本章不會(huì)用到這個(gè)默認(rèn)的index 動(dòng)作,所以你可以把executeIndex()方法從actions.clas.hpp 文件中去掉,并把indexSuccess.php 文件從templates/目錄中刪除。

NOTE 除了命令行,symfony還提供了其他的建立模塊的方法。其中之一是你自己來(lái)建立這些文件與目錄。很多時(shí)候,模塊中的動(dòng)作和模板用來(lái)處理一個(gè)表里面的數(shù)據(jù)。由于建立、獲取、更新與刪除所需的代碼往往是一樣的,symfony提供一種稱(chēng)之為腳手架(scaffolding)的機(jī)制來(lái)自動(dòng)生成一個(gè)模塊。這種技術(shù)詳見(jiàn)第14章。

圖 4-1 - 自動(dòng)生成的默認(rèn)index 頁(yè)

,

增加一個(gè)頁(yè)面

symfony 里面,頁(yè)面背后的邏輯放在動(dòng)作里面,表現(xiàn)放在模板里。不需要邏輯的頁(yè)面也需要一個(gè)空的動(dòng)作。

增加一個(gè)動(dòng)作

我們需要一個(gè)通過(guò)myAction 動(dòng)作來(lái)訪問(wèn)"Hello, world!"的頁(yè)面。要建立這個(gè)頁(yè)面,只要在mymyduleActions 類(lèi)里面增加一個(gè)executeMyAction 方法,如例4-2。

例 4-2 - 增加一個(gè)動(dòng)作就是給動(dòng)作類(lèi)增加一個(gè)執(zhí)行方法

class mymoduleActions extends sfActions

{

public function executeMyAction()

{

}

}

動(dòng)作方法的名字永遠(yuǎn)是execute ``XXX``(),方法名字的第二部分的第一個(gè)字母總是大寫(xiě)。

,

現(xiàn)在,如果你訪問(wèn)下面的網(wǎng)址:

symfony 會(huì)抱怨缺少`myActionSuccess.php'模板。這很正常;在symfony 里,一個(gè)頁(yè)面永遠(yuǎn)是由一個(gè)動(dòng)作與一個(gè)模板組成。

NOTE URL (不是域名)是區(qū)分大小寫(xiě)的,symfony也區(qū)分大小寫(xiě)(雖然在P H P 里方法名不區(qū)分大小寫(xiě))。這就是說(shuō),如果你增加一個(gè)executemyaction()方法,或者executeMyaction(),然后你在瀏覽器里訪問(wèn)myAction,symfony會(huì)返回404錯(cuò)誤信息。

SI D E B A R URL 是響應(yīng)的一部分

symfony 包含一個(gè)路由系統(tǒng),這個(gè)系統(tǒng)可以把真正的動(dòng)作名與URL 的形式分開(kāi)來(lái)。這樣就可以實(shí)現(xiàn)特殊URL 格式。你可以不受文件結(jié)構(gòu)或者請(qǐng)求參數(shù)的限制;動(dòng)作的URL 可以是你想要的樣子。例如,請(qǐng)求一個(gè)article 模塊的index 動(dòng)作的URL 常常是這樣的:

這個(gè)URL 從數(shù)據(jù)庫(kù)里面取出指定的文章。在這個(gè)例子里,這篇文章(id=123)是歐洲(europe)欄目里的一篇關(guān)于法國(guó)金融(finance in F rance)的文章。但是通過(guò)修改routing.yml 配置文件,這個(gè)URL 可以完全改成另外一種直觀的形式:http ://localhost/articles/europe/france/finance.html

這個(gè)URL 不僅對(duì)搜索引擎更友好,也對(duì)用戶(hù)更有意義,用戶(hù)可以像使用命令行一樣通過(guò)在地址欄執(zhí)行特定的查找,例如:

symfony 知道如何為用戶(hù)解析與生成漂亮的URL 。路由系統(tǒng)自動(dòng)地從一個(gè)漂亮的URL 中剝離出參數(shù)然后傳給動(dòng)作。它也能格式化回應(yīng)的超鏈接使他們看起來(lái)更" 漂亮"。這個(gè)功能詳見(jiàn)第9章。

總之,這意味著應(yīng)用程序的動(dòng)作的命名可以和他們的URL 不一致,但是動(dòng)作方法的命名必須與動(dòng)作名相統(tǒng)一。動(dòng)作名說(shuō)明動(dòng)作要做的事情,它通常是一個(gè)不定式動(dòng)詞(例如show,list,edit 等)。動(dòng)作名可以隱藏起來(lái)不讓用戶(hù)知道,所以請(qǐng)放心的使用動(dòng)作的名字(例如list B yName 或者show W ithComments)。這樣可以有效地節(jié)省注釋?zhuān)硗獯a的可讀性也大大增強(qiáng)了。

增加一個(gè)模板

,

動(dòng)作需要一個(gè)模板來(lái)表現(xiàn)自己。模板是模塊的templates/目錄里的一個(gè)文件,模板名字由動(dòng)作名與動(dòng)作終止組成。默認(rèn)的動(dòng)作終止是"success"也就是成功,所以myAction 動(dòng)作的模板名是myActionSuccess.php。

理想的模板只包含顯示代碼,所以P H P 代碼越少越好。顯示"Hello, world!"的頁(yè)面的模板可以如同例4-3中的那么簡(jiǎn)單。

例 4-3 - mymodule/templates/myActionSuccess.php 模板

Hello, world!

如果需要在模板里執(zhí)行一些P H P 代碼,你應(yīng)該避免使用通常的P H P 語(yǔ)法(如例4-

4)。相反,你應(yīng)該在模板里面使用特殊的P H P 語(yǔ)法,如例4-5所示,這樣不是P H P 程序員的人也能理解。這樣不僅最終生成的代碼的縮進(jìn)格式正確,而且可以讓你把復(fù)雜的代碼放在動(dòng)作里面,因?yàn)橹挥锌刂普Z(yǔ)句(if,foreach,while等)有特殊語(yǔ)法。

例 4-4 - 通常的P H P 語(yǔ)法,對(duì)于動(dòng)作沒(méi)問(wèn)題,對(duì)于模板就很糟糕

Hello, world!

if ($test)

{

echo "

".time()."

";

}

?>

例 4-5 - 另類(lèi)P H P 語(yǔ)法,適合于模板

Hello, world!

TI P 一般來(lái)說(shuō)模板語(yǔ)法的可讀性是否夠強(qiáng)是看這個(gè)文件是否不包含P H P 的echo 語(yǔ)句或者"{}"。大多數(shù)時(shí)候,開(kāi)始的在同一行。從動(dòng)作傳遞信息給模板

動(dòng)作要做的事情是所有的復(fù)雜計(jì)算,取出數(shù)據(jù),測(cè)試,為模板設(shè)定顯示或者測(cè)試用的變量。symfony讓動(dòng)作類(lèi)的屬性(動(dòng)作里的可以通過(guò)$this->variableName

,

訪問(wèn))能夠直接在模板里面的全局命名空間里面訪問(wèn)得到(通過(guò)$variableName)。例4-6與4-7演示如何從動(dòng)作傳遞信息給模板。

例 4-6 - 設(shè)定動(dòng)作的一個(gè)屬性,把它傳給模板

class mymoduleActions extends sfActions

{

public function executeMyAction()

{

$today = getdate();

$this->hour = $today['hours' ];

}

}

例 4-7 - 模板能直接訪問(wèn)動(dòng)作的屬性

Hello, world!

= 18) : ?>

Or should I say good evening? It's already .

NOTE 有幾個(gè)數(shù)據(jù)可以直接在模板中訪問(wèn)而不需要在動(dòng)作里面設(shè)置。每個(gè)模板都可以執(zhí)行$sf_contex,$sf_re q uest,$sf_params 還有$sf_user 對(duì)象的方法。它們包含當(dāng)前上下文、請(qǐng)求、請(qǐng)求參數(shù)還有session 的信息。不久你就能學(xué)會(huì)怎么有效的利用它們。

從用戶(hù)表單取得數(shù)據(jù)

表單是從用戶(hù)取得信息的好方法。用HTM L 寫(xiě)表單的元素有時(shí)會(huì)很麻煩,特別是你想要X HTM L 兼容時(shí)。你可以按照平常的方式在symfony 模板里面使用表單元素,如例4-8所示,不過(guò)symfony 提供了一些輔助函數(shù)來(lái)簡(jiǎn)化這個(gè)任務(wù)。

例 4-8 - 模板可以包含普通的HTM L 代碼

Hello, world!

= 18) : ?>

Or should I say good evening? It's already .

,

輔助函數(shù)是symfony 定義的用在模板里的函數(shù)。它輸出HTM L 代碼從而節(jié)省你寫(xiě)HTM L 代碼的時(shí)間。使用symfony 輔助函數(shù),你可以用例4-9的代碼達(dá)到與例4-8同樣的結(jié)果。

例 4-9 - 用輔助函數(shù)比寫(xiě)HTM L 標(biāo)簽更快更容易

Hello, world!

= 18) : ?>

Or should I say good evening? It's already .

SI D E B A R 輔助函數(shù)是來(lái)幫助你的。

如果,你認(rèn)為在例4-9的例子里,輔助函數(shù)的版本沒(méi)有寫(xiě)HTM L 快,看看這個(gè)例子:

$card_list = array(

> 'VISA' => 'Visa',

> 'MAST' => 'MasterCard',

> 'AMEX ' => 'American Express',

> 'D ISC' => 'D iscover');

> echo select_tag('cc_type', options_for _select($card_list, 'AME X '));

> ?>

上面的代碼的HTM L 輸出如下:

,

在模板里使用輔助函數(shù)使編寫(xiě)代碼的速度提高,代碼更清晰,更簡(jiǎn)潔。唯一的代價(jià)是需要花時(shí)間學(xué)習(xí)他們,學(xué)習(xí)過(guò)程將一直持續(xù)到本書(shū)完結(jié),到你在你習(xí)慣的編輯器中用快捷鍵寫(xiě)的時(shí)候。所以如果不會(huì)用symfony 的輔助函數(shù),你仍然可以繼續(xù)使用HTM L 標(biāo)簽,不過(guò)這很浪費(fèi)也很枯燥。

注意我們不推薦專(zhuān)業(yè)web 開(kāi)發(fā)者使用短開(kāi)始標(biāo)簽(

由于symfony 提供了很多輔助函數(shù)簡(jiǎn)化表單,表單處理需要一整章來(lái)講解。表單處理詳見(jiàn)第10章。

鏈接到另一個(gè)動(dòng)作

我們已經(jīng)講到動(dòng)作名與訪問(wèn)這個(gè)動(dòng)作的URL 之間需要有一個(gè)轉(zhuǎn)換過(guò)程。所以如果你建立一個(gè)到anotherAction 的鏈接,如例4-10所示,它只適用于默認(rèn)的路由設(shè)置。如果以后你決定修改URL 格式,那你還要修改所有包含這個(gè)鏈接的模板。例 4-10 - 傳統(tǒng)的超鏈接

I never say my name

為了避免這樣的麻煩,請(qǐng)使用link _to()輔助函數(shù)來(lái)建立所有的鏈接到應(yīng)用程序內(nèi)部的動(dòng)作的超鏈接。例4-11演示了如何使用超鏈接輔助函數(shù)。

例 4-11 - link_to() 輔助函數(shù)

Hello, world!

= 18) : ?>

Or should I say good evening? It's already .

,

上面的代碼生成的HTM L 與前一個(gè)例子完全一樣,但是如果修改路由規(guī)則,所有的模板會(huì)根據(jù)規(guī)則重新格式URL 。

link _to()輔助函數(shù),與很多輔助函數(shù)類(lèi)似,接受另一個(gè)特殊的參數(shù),這個(gè)參數(shù)用來(lái)傳遞HTM L 標(biāo)簽屬性。例4-12是一個(gè)option 屬性的例子還有生成的HTM L 。option 參數(shù)可以是一個(gè)數(shù)組或者一個(gè)簡(jiǎn)單的由幾個(gè)key =value 與空格組成的字符串。

例 4-12 - 大多數(shù)輔助函數(shù)有Option 參數(shù)

// 用數(shù)組作option 參數(shù)

array(

'class' => 'special_link',

'confirm' => 'Are you sure?',

'absolute' => true

)) ?>

// 用字符串作option 參數(shù)

'class=special _link confirm=Are you sure? absolute=true') ?>// 結(jié)果一樣

=>

href="http ://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous">

I never say my name

任何使用symfony 輔助函數(shù)輸出HTM L 標(biāo)簽的時(shí)候,都可以在option 參數(shù)中加入額外的屬性(例如例4-12中的class 屬性)。你甚至可以用HTM L 4.0的"快速而骯臟(q uick-and-dirty)"的方式(不寫(xiě)雙引號(hào)),symfony會(huì)用漂亮的X HTM L 方式輸出。這是用輔助函數(shù)比寫(xiě)HTM L 快的又一個(gè)原因。

NOTE 由于需要額外的解析與轉(zhuǎn)換,字符串形式比數(shù)組要慢。

與其它輔助函數(shù)類(lèi)似,鏈接輔助函數(shù)有好幾種形式與參數(shù)。第9章將向你詳細(xì)介紹這些內(nèi)容。

從請(qǐng)求中取得信息

,

無(wú)論用戶(hù)通過(guò)表單(通常是P OST 請(qǐng)求)還是通過(guò)URL (G ET 請(qǐng)求) 取得信息,你都可以在動(dòng)作中通過(guò)sfActions 對(duì)象的get R e q uest P arameter()方法取得相關(guān)的數(shù)據(jù)。例4-13演示了如何在actionAction 中取得name 參數(shù)的值。

例 4-13 - 在動(dòng)作中取得請(qǐng)求參數(shù)的值

class mymoduleActions extends sfActions

{

...

public function executeAnotherAction()

{

$this->name = $this->getR e q uest P arameter('name');

}

}

如果數(shù)據(jù)操作很簡(jiǎn)單,你甚至不必用動(dòng)作來(lái)取得參數(shù)值。模板可以直接通過(guò)$sf_params 的get()方法來(lái)取得參數(shù)的值,類(lèi)似于動(dòng)作中的

get R e q uest P arameter()方法。

如果 executeAnotherAction() 方法是空的, 例 4-14 中的這種方法也可以從anotherActionSuccess.php 模板中取到name 參數(shù)的值。

例 4-14 - 直接從模板中取得參數(shù)的值

Hello, get('name') ?>!

NOTE 為什么不直接使用$_POST,$_G ET, 或 $_RE Q U EST 變量呢?因?yàn)槿绻愕腢RL 的格式會(huì)變化(例如

$sf_params 對(duì)象的作用僅僅是數(shù)組的替代品。例如,如果你想判斷一個(gè)請(qǐng)求參數(shù)是否存在,你可以只用$sf_params->has()方法而不必用get()方法取得實(shí)際的值,如例4-15。

例 4-15 - 在模板中判斷一個(gè)參數(shù)是否存在

has('name')): ?>

Hello, get('name') ?>!

標(biāo)簽: