溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Symfony頁(yè)面的基本創(chuàng)建方法

發(fā)布時(shí)間:2021-07-01 10:20:58 來(lái)源:億速云 閱讀:177 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Symfony頁(yè)面的基本創(chuàng)建方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Symfony頁(yè)面的基本創(chuàng)建方法”吧!

本文實(shí)例分析了Symfony頁(yè)面的基本創(chuàng)建方法。分享給大家供大家參考。具體如下:

這里我們將會(huì)學(xué)習(xí)如何創(chuàng)建一個(gè)模塊,這是組織頁(yè)面的結(jié)構(gòu)化元素。同時(shí)我們也會(huì)學(xué)習(xí)如何創(chuàng)創(chuàng)建一個(gè)分為一個(gè)動(dòng)作也一個(gè)模板的頁(yè)面,之所以分為動(dòng)作與模板,是因?yàn)镸VC模式。鏈接與表彰是基本的頁(yè)面交互,我們將會(huì)學(xué)習(xí)如何在模板中插入這些元素并且在動(dòng)作中進(jìn)行處理。

創(chuàng)建一個(gè)模塊框架

Symfony將頁(yè)面組織為模塊。在創(chuàng)建一個(gè)頁(yè)面之前,我們需要?jiǎng)?chuàng)建一個(gè)模塊,并且初始化為一個(gè)Symfony可以識(shí)別的文件結(jié)構(gòu)的空殼。

Symfony命令行自動(dòng)化處理模塊的創(chuàng)建。我們只需要調(diào)用init-module任務(wù),并且使用程序名以及模塊名作為參數(shù)。在創(chuàng)建了一個(gè)myapp程序之后,要向這個(gè)程序中添加一個(gè)mymodule模塊,我們可以輸入下面的命令:

復(fù)制代碼 代碼如下:

> 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è)命令只創(chuàng)建三個(gè)文件。位于test/目錄中的一個(gè)為單元測(cè)試。actions.class.php指向默認(rèn)的模塊歡迎頁(yè)面。templates/indexSuccess.php文件為空。

在actions/actions.class.php文件中默認(rèn)生成的動(dòng)作:

復(fù)制代碼 代碼如下:

<?php
 class mymoduleActions extends sfActions
 {
   public function executeIndex()
     {
         $this->forward('default', 'module');
     }
   }
?>


對(duì)于每一個(gè)新的模塊,Symfony會(huì)創(chuàng)建一個(gè)默認(rèn)的index動(dòng)作。他是由一個(gè)名為executeIndex的動(dòng)作方法以及一個(gè)名為indexSuccess.php的模板文件組成。我們可以通過(guò)下面的URL來(lái)瀏覽相應(yīng)的頁(yè)面:
http://localhost/myapp_dev.php/mymodule/index
這里我們并不會(huì)使用默認(rèn)的index動(dòng)作,所以我們可以從actions.class.php文件中移除executeIndex()方法,并且從templates/目錄中刪除indexSuccess.php文件。

除了命令行,Symfony還提供了其他的方法來(lái)初始化一個(gè)模塊。其中一個(gè)方法就是手動(dòng)來(lái)創(chuàng)建目錄與文件。在許多情況下,一個(gè)模塊的動(dòng)作與模板就意味著操作一個(gè)給定數(shù)據(jù)表的數(shù)據(jù)。因?yàn)閯?chuàng)建,獲取,更新,以及從一個(gè)數(shù)據(jù)表中刪除數(shù)據(jù)記錄的必須代碼通常都是相同的,Symfony提供了一個(gè)名為框架的機(jī)制來(lái)我們生成這些代碼。我們后續(xù)會(huì)繼續(xù)介紹。

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

在Symfony中,頁(yè)面后面的邏輯存儲(chǔ)在動(dòng)作中,而表面則是在模板中。沒有邏輯的頁(yè)面仍然需要一個(gè)空的動(dòng)作。

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

"Hello,world!"頁(yè)面則會(huì)通過(guò)一個(gè)myAction的動(dòng)作進(jìn)行訪問(wèn)。要?jiǎng)?chuàng)建這個(gè)動(dòng)作,只需要在mymoduleActions類中添加一個(gè)executeMyAction方法,如下所示:

復(fù)制代碼 代碼如下:

<?php
 class mymoduleActions extends sfActions
 {
   public function executeMyAction()
     {
     }
 }

動(dòng)作方法的名字總是execute'Xxx'()的形式,其中名字的第二部分是動(dòng)作的名字,并且第一個(gè)字母大寫。

現(xiàn)在我們可以請(qǐng)求下面的URL:
http://localhost/myapp_dev.php/mymodule/myAction

Symfony將會(huì)抱怨丟失了myActionSuccess.php模板。這是正常的。在Symfony中,一個(gè)頁(yè)面通常是由一個(gè)動(dòng)和與一個(gè)模板組成的。

URL是響應(yīng)的一部分

Symfony包含一個(gè)路由系統(tǒng)允許我們?cè)趯?shí)際的動(dòng)作名與需要調(diào)用的URL格式之間有一個(gè)完整的分隔。這允許自定義URL的自定義格式,就如同他是響應(yīng)的一部分。我們不再為文件的結(jié)構(gòu)或是請(qǐng)求的參數(shù)據(jù)限制,一個(gè)動(dòng)作的URL看起來(lái)就我們所希望的解析。例如,到一個(gè)名為article模塊的索引動(dòng)作調(diào)用通常如下面的樣子:
http://localhost/myapp_dev.php/article/index?id=123

這個(gè)URL由一個(gè)數(shù)據(jù)獲取一篇指定的文章。但是URL可以通過(guò)在routingyml配置文件中作一些小的改動(dòng)而以一種完全不同的方式進(jìn)行編寫:
http://localhost/articles/europe/france/finance.html

這樣的URL不僅對(duì)于搜索引擎友好的,他對(duì)于用戶來(lái)說(shuō)也是十分重要的,這樣用戶就可以將地址欄作為一個(gè)偽碼命令來(lái)自定義查詢,例如下面的例子:
http://localhost/articles/tagged/finance+france+euro

Symfony知道如何為用戶解析并生成URL。路由系統(tǒng)會(huì)自動(dòng)從一個(gè)簡(jiǎn)潔URL中脫去所請(qǐng)求的參數(shù),并使其為動(dòng)作可用。他同時(shí)也會(huì)格式化響應(yīng)中所包含的超鏈接,從而使其看起來(lái)更為簡(jiǎn)潔。我們將會(huì)在第九章了解這個(gè)特性的更多內(nèi)容。

總之,這就意味著我們命名程序的動(dòng)作的方式不應(yīng)受到調(diào)用他們的URL的樣子的影響,而是受程序中動(dòng)作的函數(shù)控制。一個(gè)動(dòng)作的名了解釋了動(dòng)作實(shí)際所做的內(nèi)容,而且通常為不定式格式中的一個(gè)動(dòng)詞(例如show,list,edit)。動(dòng)作的名字可以做到對(duì)于終端用戶完全不可見,從而不必?fù)?dān)心使用顯式的動(dòng)作名。我們可以有效的利用代碼注釋來(lái)解釋我們的函數(shù)功能,從而使代碼更讀。

添加一個(gè)模板

動(dòng)作需要一個(gè)模板來(lái)進(jìn)行封裝。一個(gè)模板就是位于一個(gè)模塊的templates/目錄的一個(gè)文件,通常是以動(dòng)作和動(dòng)作的詞尾來(lái)進(jìn)行命名的。默認(rèn)的動(dòng)作詞尾為"success",所以為myAction動(dòng)作所創(chuàng)建的模板文件應(yīng)命名為myActionSuccess.php。

模板只包含表現(xiàn)代碼,所以在其中要包含盡可有少的PHP代碼。實(shí)際上,一個(gè)顯示"Hello,world!"的頁(yè)面只有一行的代碼的模板。

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>

如果我們需要在模板中運(yùn)行一些PHP代碼,我們應(yīng)避免使用下面所列的通常的PHP語(yǔ)法。相反,應(yīng)使用另一種PHP語(yǔ)法來(lái)編寫我們的模板,從而使得代碼對(duì)于非PHP程序來(lái)說(shuō)更易于理解。不僅最終代碼是正確的,而且有助于我們?cè)趧?dòng)作中保持復(fù)雜的PHP代碼,因?yàn)橹挥锌刂普Z(yǔ)句有對(duì)應(yīng)代碼。

通常的PHP語(yǔ)法如下:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php
 
 if ($test)
 {
   echo "<p>".time()."</p>";
 }
   
?>

替代的PHP語(yǔ)法如下:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php if ($test): ?>
<p><?php echo time(); ?></p>
<?php endif; ?>


 
由動(dòng)作向模板傳遞信息

動(dòng)作的工作是要完成所有復(fù)雜的計(jì)算,數(shù)據(jù)讀取以及測(cè)試,并且設(shè)置要輸出或是測(cè)試的模板變量。Symfony使得動(dòng)作類的屬性在全局名字空間中為模板可用。下面顯示如何由動(dòng)作向模板傳遞信息。

在動(dòng)作中設(shè)置動(dòng)作屬性從而使其為模板可用:

復(fù)制代碼 代碼如下:

<?php
 
 class mymoduleActions extends sfActions
 {
   public function executeMyAction()
     {
         $today = getdate();
     $this->hour = $today['hours'];
     }
 }

模板直接訪問(wèn)動(dòng)作屬性:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
<?php endif; ?>

模板已經(jīng)可以訪問(wèn)一些數(shù)據(jù),而不需要在動(dòng)作中設(shè)置任何變量。每一個(gè)模板通??梢哉{(diào)用$sf_context,$sf_request,$sf_params,$sf_user對(duì)象的方法。他們包含與當(dāng)前內(nèi)容,請(qǐng)求,請(qǐng)求參數(shù)以及會(huì)話相關(guān)的數(shù)據(jù)。我們很快就會(huì)學(xué)到他們的用法。

使用表單向用戶收集信息

表單是向用戶收集信息的一個(gè)好方法。使用HTML編寫表單以及表單元素有時(shí)是相當(dāng)麻煩的,尤其是當(dāng)我們希望適用于XTHML時(shí)更是如此。我們可以用通常的方式在Symfony模板中包含表單元素,如下面所示,但是Symfony提供了幫助器從而使得這個(gè)任務(wù)更為簡(jiǎn)單。

模板可以包含通常的HTML代碼:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
<?php endif; ?>
<form method="post" target="/myapp_dev.php/mymodule/anotherAction">
  <label for="name">What is your name?</label>
  <input type="text" name="name" id="name" value="" />
  <input type="submit" value="Ok" />
</form>

一個(gè)幫助器是用在模板中的由Symfony定義的PHP函數(shù)。他輸出HTML代碼,并且比我們自己編寫實(shí)際的HTML代碼要快速得多。使用Symfony幫助器,我們用下面的代碼得到的輸出結(jié)果與上面通常的HTML代碼相同:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
<?php endif; ?>
<?php echo form_tag('mymodule/anotherAction') ?>
  <?php echo label_for('name', 'What is your name?') ?>
  <?php echo input_tag('name') ?>
  <?php echo submit_tag('Ok') ?>
</form>

如果在上面的代碼中,我們認(rèn)為使用幫助器的版本并不會(huì)比編寫HTML代碼快,那么我們可以考慮一下下面的情況:

復(fù)制代碼 代碼如下:

<?php
     $card_list = array(
       'VISA' => 'Visa',
       'MAST' => 'MasterCard',
       'AMEX' => 'American Express',
       'DISC' => 'Discover');
     echo select_tag('cc_type', options_for_select($card_list, 'AMEX'));
?>

這會(huì)得到下面的HTML輸出結(jié)果:

復(fù)制代碼 代碼如下:

<select name="cc_type" id="cc_type">
  <option value="VISA">Visa</option>
  <option value="MAST">MasterCard</option>
  <option value="AMEX" selected="selected">American Express</option>
  <option value="DISC">Discover</option>
</select>

在模板中使用的幫助器的好處就在于加快了編碼的速度,代碼的清晰與簡(jiǎn)潔。而代價(jià)就是我們需要花費(fèi)時(shí)進(jìn)行學(xué)習(xí)。所以我們可以在模板中不使用Symfony幫助器,并且以我們通常的方式來(lái)編寫代碼,但是這會(huì)是一個(gè)巨大的損失。

注意,短開放標(biāo)記的用法(<?=,等同于<?php echo)并不推薦在專業(yè)的web程序中使用,因?yàn)槲覀兊膚eb服務(wù)器也許會(huì)理解多個(gè)腳本語(yǔ)言,從而會(huì)使其變得迷惑。另外,短開放標(biāo)記并不會(huì)與默認(rèn)的PHP配置進(jìn)行工作,而且需要修改服務(wù)來(lái)激活。最后,當(dāng)我們必須處理XML與驗(yàn)證時(shí),他會(huì)出錯(cuò),因?yàn)?lt;?在XML中有著特殊的意義。

表單處理有專門的一章進(jìn)行討論,因?yàn)镾ymfony提供了許多工具,絕大數(shù)的幫助器,來(lái)使其簡(jiǎn)單。我們將會(huì)在第10章了解到關(guān)于幫助器更多的內(nèi)容。

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

我們現(xiàn)在已經(jīng)知道在動(dòng)作名字與需要調(diào)用的URL之間有一個(gè)分離。所以我們使用下面的方式來(lái)創(chuàng)建到另一個(gè)動(dòng)作的鏈接時(shí),他只會(huì)工作在默認(rèn)的路由系統(tǒng)中。如果我們以后決定改變URL的樣子,那么我們就需要查看所有的模板來(lái)改變超鏈接。

超鏈接,通常的方法:

復(fù)制代碼 代碼如下:

<a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous">
  I never say my name
</a>

要避免這樣的麻煩,我們應(yīng)總是使用link_to()幫助器來(lái)我們的程序動(dòng)作創(chuàng)建超鏈接。下面的例子演示了超鏈接幫助器的用法。

link_to()幫助器:

復(fù)制代碼 代碼如下:

<p>Hello, world!</p>
<?php if ($hour >= 18): ?>
<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
<?php endif; ?>
<?php echo form_tag('mymodule/anotherAction') ?>
  <?php echo label_for('name', 'What is your name?') ?>
  <?php echo input_tag('name') ?>
  <?php echo submit_tag('Ok') ?>
  <?php echo link_to('I never say my name','mymodule/anotherAction?name=anonymous') ?>
</form>

生成的HTML與前面的相同,所不同的就在于當(dāng)我們改變我們的路由規(guī)則時(shí),所有的模板都會(huì)正確工作,并且重新格式化URL。

link_to()幫助器,就像其他的幫助器,會(huì)接受特定選項(xiàng)的額外參數(shù)和額外的標(biāo)簽屬性。下面的例子顯示了一個(gè)可選參數(shù)以及生成的HTML。選項(xiàng)參數(shù)或者是一個(gè)相關(guān)的數(shù)組或者是由空格分隔的顯示key=value的簡(jiǎn)單字符串。

大多數(shù)幫助器接收一個(gè)可選參數(shù):

復(fù)制代碼 代碼如下:

// Option argument as an associative array
<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',
  array(
      'class'    => 'special_link',
          'confirm'  => 'Are you sure?',
          'absolute' => true
)) ?>
   
// Option argument as a string
<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',
  'class=special_link confirm=Are you sure? absolute=true') ?>
         
// Both calls output the same
=> <a class="special_link" onclick="return confirm('Are you sure?');"
    href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous">
    I never say my name</a>

任何時(shí)候我們使用一個(gè)Symfony幫助器來(lái)輸出一個(gè)HTML標(biāo)記時(shí),我們可以在可選參數(shù)中插入額外的標(biāo)記屬性。我們可以使用HTML 4.0的方式來(lái)編寫這樣的屬性,而Symfony將會(huì)以更簡(jiǎn)潔的格式進(jìn)行輸出。這也就是為什么幫助器會(huì)比HTML更容易編寫的原因。

因?yàn)樗枰粋€(gè)額外的分析與轉(zhuǎn)換,字符串語(yǔ)法比數(shù)組語(yǔ)法要慢一些。

與表單幫助器相類似,鏈接幫助器有更多的數(shù)量和選項(xiàng)。

由請(qǐng)求得到信息

無(wú)論用戶通過(guò)表單發(fā)送信息(通常以POST請(qǐng)求的方式)還是通過(guò)URL(GET請(qǐng)求),我們可以通過(guò)帶有sfActions對(duì)象的getRequestParameter()方法的動(dòng)作來(lái)獲取數(shù)據(jù)。下面的例子顯示如何在anotherAction中得到name參數(shù)的值。

在動(dòng)作中由請(qǐng)求參數(shù)得到數(shù)據(jù):

復(fù)制代碼 代碼如下:

<?php
 
class mymoduleActions extends sfActions
{
  ...
 
  public function executeAnotherAction()
  {
    $this->name = $this->getRequestParameter('name');
  }
}

如果數(shù)據(jù)的處理是簡(jiǎn)單的,我們甚至并不需要使用動(dòng)作來(lái)得到請(qǐng)求參數(shù)。模板可以訪問(wèn)一個(gè)名為$sf_params的對(duì)象,他提供了get()方法來(lái)得到請(qǐng)求參數(shù),就如同動(dòng)作中的getRequestParameter()方法。

如果executeAnotherAction()方法是空的,下面的例子顯示了anotherActionSuccess.php模板文件如何得到同樣的name參數(shù)。

在模板中直接由請(qǐng)求參數(shù)得到數(shù)據(jù):

復(fù)制代碼 代碼如下:

<p>Hello, <?php echo $sf_params->get('name') ?>!</p>

那么為什么不使用$_POST,$_GET或是$_REQUEST變量呢?因?yàn)槲覀兊腢RL將會(huì)不同的方式進(jìn)行格式化(http://localhost/articles/europe/france/finance.html),這樣通常的PHP變量就會(huì)再起作用,并且只有路由系統(tǒng)可以得到請(qǐng)求參數(shù)。而我們希望添加輸入過(guò)濾來(lái)阻止惡意代碼注入,而這只有當(dāng)我們將所有的請(qǐng)求參數(shù)保存在一個(gè)簡(jiǎn)潔的參數(shù)裝配器中才可能。

$sf_params對(duì)象比僅提供一個(gè)與數(shù)組等同的方法要強(qiáng)大得多。例如,如果我們只是希望檢測(cè)一個(gè)請(qǐng)求參數(shù)是否存在,我們可以簡(jiǎn)單的使用$sf_params->has()方法,而不使用get()測(cè)試實(shí)際的值。

在模板中測(cè)試請(qǐng)求參數(shù)的存在:

復(fù)制代碼 代碼如下:

<?php if ($sf_params->has('name')): ?>
  <p>Hello, <?php echo $sf_params->get('name') ?>!</p>
<?php else: ?>
  <p>Hello, John Doe!</p>
<?php endif; ?>

我們已經(jīng)猜到了,這可以在單一的代碼行中編寫。與Symfony中大多數(shù)的獲取方法一樣,動(dòng)作中的getRequestParameter()方法與模板中的$sf_params->get()(實(shí)際上調(diào)用同一個(gè)對(duì)象的相同主法)方法接受第二個(gè)參數(shù):如果沒有提供請(qǐng)求參數(shù)則使用默認(rèn)值:

復(fù)制代碼 代碼如下:

<p>Hello, <?php echo $sf_params->get('name', 'John Doe') ?>!</p>

總結(jié)

在Symfony中,頁(yè)面是由一個(gè)動(dòng)作(actions/actions.class.php文件中以execute為前綴的一個(gè)方法)和一個(gè)模板(templates/目錄下的一個(gè)文件,通常以Success.php結(jié)尾)組成的。他們通地在程序中的函數(shù)組織在一個(gè)模塊中。編寫模板是由幫助器來(lái)完成的,而幫助器則是由Symfony提供的返回HTML代碼的函數(shù)。而我們需要將URL看作響應(yīng)的一部分,而URL在需要可以格式化,所以我們應(yīng)避免在動(dòng)作命名中使用到URL的直接引用或者是請(qǐng)求參數(shù)檢索。

一旦我們知道了這些基本原則,我們就可以使用Symfony來(lái)編寫一個(gè)完整的Web程序了。但是我們的路還有很長(zhǎng),因?yàn)槲覀冊(cè)诔绦蜷_發(fā)過(guò)程需要處理的每一個(gè)任務(wù)由一些Symfony特性來(lái)完成的。

到此,相信大家對(duì)“Symfony頁(yè)面的基本創(chuàng)建方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI