Symfony頁面的基本建立執行個體詳解,symfony執行個體詳解_PHP教程

來源:互聯網
上載者:User

Symfony頁面的基本建立執行個體詳解,symfony執行個體詳解


本文執行個體分析了Symfony頁面的基本建立方法。分享給大家供大家參考。具體如下:

這裡我們將會學習如何建立一個模組,這是組織頁面的結構化元素。同時我們也會學習如何創建立一個分為一個動作也一個模板的頁面,之所以分為動作與模板,是因為MVC模式。連結與表彰是基本的頁面互動,我們將會學習如何在模板中插入這些元素並且在動作中進行處理。

建立一個模組架構

Symfony將頁面組織為模組。在建立一個頁面之前,我們需要建立一個模組,並且初始化為一個Symfony可以識別的檔案結構的空殼。

Symfony命令列自動化處理模組的建立。我們只需要調用init-module任務,並且使用程式名以及模組名作為參數。在建立了一個myapp程式之後,要向這個程式中添加一個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/目錄相分離,這個命令只建立三個檔案。位於test/目錄中的一個為單元測試。actions.class.php指向預設的模組歡迎頁面。templates/indexSuccess.php檔案為空白。

在actions/actions.class.php檔案中預設產生的動作:
複製代碼 代碼如下:<?php
class mymoduleActions extends sfActions
{
public function executeIndex()
{
$this->forward('default', 'module');
}
}
?>
對於每一個新的模組,Symfony會建立一個預設的index動作。他是由一個名為executeIndex的動作方法以及一個名為indexSuccess.php的模板檔案組成。我們可以通過下面的URL來瀏覽相應的頁面:
http://localhost/myapp_dev.php/mymodule/index
這裡我們並不會使用預設的index動作,所以我們可以從actions.class.php檔案中移除executeIndex()方法,並且從templates/目錄中刪除indexSuccess.php檔案。

除了命令列,Symfony還提供了其他的方法來初始化一個模組。其中一個方法就是手動來建立目錄與檔案。在許多情況下,一個模組的動作與模板就意味著操作一個給定資料表的資料。因為建立,擷取,更新,以及從一個資料表中刪除資料記錄的必須代碼通常都是相同的,Symfony提供了一個名為架構的機制來我們產生這些代碼。我們後續會繼續介紹。

添加一個頁面

在Symfony中,頁面後面的邏輯儲存在動作中,而表面則是在模板中。沒有邏輯的頁面仍然需要一個空的動作。

添加一個動作

"Hello,world!"頁面則會通過一個myAction的動作進行訪問。要建立這個動作,只需要在mymoduleActions類中添加一個executeMyAction方法,如下所示:
複製代碼 代碼如下:<?php
class mymoduleActions extends sfActions
{
public function executeMyAction()
{
}
}

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

現在我們可以請求下面的URL:
http://localhost/myapp_dev.php/mymodule/myAction

Symfony將會抱怨丟失了myActionSuccess.php模板。這是正常的。在Symfony中,一個頁面通常是由一個動和與一個模板組成的。

URL是響應的一部分

Symfony包含一個路由系統允許我們在實際的動作名與需要調用的URL格式之間有一個完整的分隔。這允許自訂URL的自訂格式,就如同他是響應的一部分。我們不再為檔案的結構或是請求的參資料限制,一個動作的URL看起來就我們所希望的解析。例如,到一個名為article模組的索引動作調用通常如下面的樣子:
http://localhost/myapp_dev.php/article/index?id=123

這個URL由一個資料擷取一篇指定的文章。但是URL可以通過在routingyml設定檔中作一些小的改動而以一種完全不同的方式進行編寫:
http://localhost/articles/europe/france/finance.html

這樣的URL不僅對於搜尋引擎友好的,他對於使用者來說也是十分重要的,這樣使用者就可以將地址欄作為一個偽碼命令來自訂查詢,例如下面的例子:
http://localhost/articles/tagged/finance+france+euro

Symfony知道如何為使用者解析並產生URL。路由系統會自動從一個簡潔URL中脫去所請求的參數,並使其為動作可用。他同時也會格式化響應中所包含的超連結,從而使其看起來更為簡潔。我們將會在第九章瞭解這個特性的更多內容。

總之,這就意味著我們命名程式的動作的方式不應受到調用他們的URL的樣子的影響,而是受程式中動作的函數控制。一個動作的名瞭解釋了動作實際所做的內容,而且通常為不定式格式中的一個動詞(例如show,list,edit)。動作的名字可以做到對於終端使用者完全不可見,從而不必擔心使用顯式的動作名。我們可以有效利用代碼注釋來解釋我們的函數功能,從而使代碼更讀。

添加一個模板

動作需要一個模板來進行封裝。一個模板就是位於一個模組的templates/目錄的一個檔案,通常是以動作和動作的詞尾來進行命名的。預設的動作詞尾為"success",所以為myAction動作所建立的模板檔案應命名為myActionSuccess.php。

模板只包含表現代碼,所以在其中要包含盡可有少的PHP代碼。實際上,一個顯示"Hello,world!"的頁面只有一行的代碼的模板。
複製代碼 代碼如下:

Hello, world!

如果我們需要在模板中運行一些PHP代碼,我們應避免使用下面所列的通常的PHP文法。相反,應使用另一種PHP文法來編寫我們的模板,從而使得代碼對於非PHP程式來說更易於理解。不僅最終代碼是正確的,而且有助於我們在動作中保持複雜的PHP代碼,因為只有控制語句有對應代碼。

通常的PHP文法如下:
複製代碼 代碼如下:

Hello, world!


<?php

if ($test)
{
echo "

".time()."

";
}

?>

替代的PHP文法如下:
複製代碼 代碼如下:

Hello, world!


<?php if ($test): ?>

<?php echo time(); ?>


<?php endif; ?>

由動作向模板傳遞資訊

動作的工作是要完成所有複雜的計算,資料讀取以及測試,並且設定要輸出或是測試的模板變數。Symfony使得動作類的屬性在全域名字空間中為模板可用。下面顯示如何由動作向模板傳遞資訊。

在動作中設定動作屬性從而使其為模板可用:
複製代碼 代碼如下:<?php

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

模板直接存取動作屬性:
複製代碼 代碼如下:

Hello, world!


<?php if ($hour >= 18): ?>

Or should I say good evening? It's already <?php echo $hour ?>.


<?php endif; ?>

模板已經可以訪問一些資料,而不需要在動作中設定任何變數。每一個模板通常可以調用$sf_context,$sf_request,$sf_params,$sf_user對象的方法。他們包含與當前內容,請求,請求參數以及會話相關的資料。我們很快就會學到他們的用法。

使用表單向使用者收集資訊

表單是向使用者收集資訊的一個好方法。使用HTML編寫表單以及表單元素有時是相當麻煩的,尤其是當我們希望適用於XTHML時更是如此。我們可以用通常的方式在Symfony模板中包含表單元素,如下面所示,但是Symfony提供了協助器從而使得這個任務更為簡單。

模板可以包含通常的HTML代碼:
複製代碼 代碼如下:

Hello, world!


<?php if ($hour >= 18): ?>

Or should I say good evening? It's already <?php echo $hour ?>.


<?php endif; ?>

一個協助器是用在模板中的由Symfony定義的PHP函數。他輸出HTML代碼,並且比我們自己編寫實際的HTML代碼要快速得多。使用Symfony協助器,我們用下面的代碼得到的輸出結果與上面通常的HTML代碼相同:
複製代碼 代碼如下:

Hello, world!


<?php if ($hour >= 18): ?>

Or should I say good evening? It's already <?php echo $hour ?>.


<?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') ?>

如果在上面的代碼中,我們認為使用協助器的版本並不會比編寫HTML代碼快,那麼我們可以考慮一下下面的情況:
複製代碼 代碼如下:<?php
$card_list = array(
'VISA' => 'Visa',
'MAST' => 'MasterCard',
'AMEX' => 'American Express',
'DISC' => 'Discover');
echo select_tag('cc_type', options_for_select($card_list, 'AMEX'));
?>

這會得到下面的HTML輸出結果:
複製代碼 代碼如下: Visa MasterCard American Express Discover

在模板中使用的協助器的好處就在於加快了編碼的速度,代碼的清晰與簡潔。而代價就是我們需要花費時進行學習。所以我們可以在模板中不使用Symfony協助器,並且以我們通常的方式來編寫代碼,但是這會是一個巨大的損失。

注意,短開放標記的用法(<?=,等同於<?php echo)並不推薦在專業的web程式中使用,因為我們的web伺服器也許會理解多個指令碼語言,從而會使其變得迷惑。另外,短開放標記並不會與預設的PHP配置進行工作,而且需要修改服務來啟用。最後,當我們必須處理XML與驗證時,他會出錯,因為<?在XML中有著特殊的意義。

表單處理有專門的一章進行討論,因為Symfony提供了許多工具,絕大數的協助器,來使其簡單。我們將會在第10章瞭解到關於協助器更多的內容。

連結到另一個動作

我們現在已經知道在動作名字與需要調用的URL之間有一個分離。所以我們使用下面的方式來建立到另一個動作的連結時,他只會工作在預設的路由系統中。如果我們以後決定改變URL的樣子,那麼我們就需要查看所有的模板來改變超連結。

超連結,通常的方法:
複製代碼 代碼如下:
I never say my name

要避免這樣的麻煩,我們應總是使用link_to()協助器來我們的程式動作建立超連結。下面的例子示範了超連結協助器的用法。

link_to()協助器:
複製代碼 代碼如下:

Hello, world!


<?php if ($hour >= 18): ?>

Or should I say good evening? It's already <?php echo $hour ?>.


<?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') ?>

產生的HTML與前面的相同,所不同的就在於當我們改變我們的路由規則時,所有的模板都會正確工作,並且重新格式化URL。

link_to()協助器,就像其他的協助器,會接受特定選項的額外參數和額外的標籤屬性。下面的例子顯示了一個選擇性參數以及產生的HTML。選項參數或者是一個相關的數組或者是由空格分隔的顯示key=value的簡單字串。

大多數協助器接收一個選擇性參數:
複製代碼 代碼如下:// 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
=> href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous">
I never say my name

任何時候我們使用一個Symfony協助器來輸出一個HTML標記時,我們可以在選擇性參數中插入額外的標記屬性。我們可以使用HTML 4.0的方式來編寫這樣的屬性,而Symfony將會以更簡潔的格式進行輸出。這也就是為什麼協助器會比HTML更容易編寫的原因。

因為他需要一個額外的分析與轉換,字串文法比數組文法要慢一些。

與表單協助器相類似,連結協助器有更多的數量和選項。

由請求得到資訊

無論使用者通過表單發送資訊(通常以POST請求的方式)還是通過URL(GET請求),我們可以通過帶有sfActions對象的getRequestParameter()方法的動作來擷取資料。下面的例子顯示如何在anotherAction中得到name參數的值。

在動作中由請求參數得到資料:
複製代碼 代碼如下:<?php

class mymoduleActions extends sfActions
{
...

public function executeAnotherAction()
{
$this->name = $this->getRequestParameter('name');
}
}

如果資料的處理是簡單的,我們甚至並不需要使用動作來得到請求參數。模板可以訪問一個名為$sf_params的對象,他提供了get()方法來得到請求參數,就如同動作中的getRequestParameter()方法。

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

在模板中直接由請求參數得到資料:
複製代碼 代碼如下:

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

那麼為什麼不使用$_POST,$_GET或是$_REQUEST變數呢?因為我們的URL將會不同的方式進行格式化(http://localhost/articles/europe/france/finance.html),這樣通常的PHP變數就會再起作用,並且只有路由系統可以得到請求參數。而我們希望添加輸入過濾來阻止惡意代碼注入,而這隻有當我們將所有的請求參數儲存在一個簡潔的參數裝配器中才可能。

$sf_params對象比僅提供一個與數組等同的方法要強大得多。例如,如果我們只是希望檢測一個請求參數是否存在,我們可以簡單的使用$sf_params->has()方法,而不使用get()測試實際的值。

在模板中測試請求參數的存在:
複製代碼 代碼如下:<?php if ($sf_params->has('name')): ?>

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


<?php else: ?>

Hello, John Doe!


<?php endif; ?>

我們已經猜到了,這可以在單一的程式碼中編寫。與Symfony中大多數的擷取方法一樣,動作中的getRequestParameter()方法與模板中的$sf_params->get()(實際上調用同一個對象的相同主法)方法接受第二個參數:如果沒有提供請求參數則使用預設值:
複製代碼 代碼如下:

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

總結

在Symfony中,頁面是由一個動作(actions/actions.class.php檔案中以execute為首碼的一個方法)和一個模板(templates/目錄下的一個檔案,通常以Success.php結尾)組成的。他們通地在程式中的函數組織在一個模組中。編寫模板是由協助器來完成的,而協助器則是由Symfony提供的返回HTML代碼的函數。而我們需要將URL看作響應的一部分,而URL在需要可以格式化,所以我們應避免在動作命名中使用到URL的直接引用或者是請求參數檢索。

一旦我們知道了這些基本原則,我們就可以使用Symfony來編寫一個完整的Web程式了。但是我們的路還有很長,因為我們在程式開發過程需要處理的每一個任務由一些Symfony特性來完成的。

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

http://www.bkjia.com/PHPjc/947924.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/947924.htmlTechArticleSymfony頁面的基本建立執行個體詳解,symfony執行個體詳解 本文執行個體分析了Symfony頁面的基本建立方法。分享給大家供大家參考。具體如下: 這裡我們...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.