鍍金池/ 教程/ PHP/ 路由和控制器
開始構(gòu)建一個(gè)框架應(yīng)用程序
模塊
路由和控制器
表單和動(dòng)作
結(jié)尾
開始使用 Zend Framework 2
樣式和翻譯
數(shù)據(jù)和模型

路由和控制器

我們將構(gòu)建一個(gè)非常簡(jiǎn)單的清單系統(tǒng)來展示我們的 album 集合。主頁列舉了我們的集合以及允許添加,修改和刪除專輯。因此需要如下頁面:

頁面 描述
主頁 顯示專輯的列表,并提供鏈接來編輯和刪除專輯,也可以添加新專輯。
添加新專輯 這個(gè)頁面提供表單來添加新專輯。
編輯專輯 這個(gè)頁面提供表單來編輯專輯。
刪除專輯 這個(gè)頁面將會(huì)確認(rèn)我們是否要?jiǎng)h除專輯,然后刪除。

在構(gòu)建文件之前,最重要的是要理解框架組織頁面的方式。程序的每個(gè)頁面被稱為一個(gè)動(dòng)作,動(dòng)作被分組劃分給控制器模塊。因此,你通常需要將相關(guān)聯(lián)的動(dòng)作劃分到同一個(gè)控制器。例如,一個(gè)新聞控制器或許有如下動(dòng)作:current,archivedview。

給專輯申請(qǐng)四個(gè)頁面,將這些頁面分組劃分給單個(gè)控制器 AlbumController ,在 Album 模塊中作為動(dòng)作。這四個(gè)動(dòng)作如下:

Page Controller Action
Home AlbumController index
Add new album AlbumController add
Edit album AlbumController edit
Delete album AlbumController delete

URL 指定了一個(gè)特定的動(dòng)作來使用 route,這個(gè) route 在 module.config.php 模塊定義。我們將添加一個(gè) route 到我們的專輯動(dòng)作中去。更新模塊的配置文件與新代碼會(huì)高亮顯示。

return array(
    'controllers' => array(
        'invokables' => array(
            'Album\Controller\Album' => 'Album\Controller\AlbumController',
        ),
    ),

    // The following section is new and should be added to your file
    'router' => array(
        'routes' => array(
            'album' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/album[/:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Album\Controller\Album',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);

route 的名字是 ‘a(chǎn)lbum’,其類型是 ‘segment’。segment route 允許我們指定 URL 模式中的占位符 (route),將其映射到命名參數(shù)匹配的 route。名字為 /album[/:action][/:id] 路由,將配備所有由 /album 開頭的 URL。下一個(gè) segment 是可選的動(dòng)作名,最后一個(gè)字段將會(huì)被映射到可選 id。方括號(hào)括起來參數(shù)的是可選的,這些約束可以讓我們明確知道在字段中字符是可預(yù)料的,所以動(dòng)作的第一個(gè)單詞被限制為字母,隨后的字符可以是數(shù)字、字母、下劃線和連字符。我們規(guī)定 id 必須是數(shù)字。

route 允許我們可以有如下的 URL 格式:

URL Page Action
/album 主頁 (專輯列表) index
/album/add 添加新的專輯 add
/album/edit/2 編輯 id 為 2 的專輯 edit
/album/delete/4 刪除 id 為 4 的專輯 delete

創(chuàng)建控制器

現(xiàn)在已經(jīng)準(zhǔn)備好構(gòu)建控制器了。在 Zend Framework 2 中,控制器是一個(gè)類,也就是所謂的 {Controller name}Controller。注意,{Controller name} 的命名必須是大寫字母開頭。控制器的定義必須存放在模塊 Controller 文件夾下的,名字格式為 {Controller name}Controller.php 的文件中。在本例中,模塊文件夾是 module/Album/src/Album/Controller。每一個(gè)動(dòng)作是在控制器類中一個(gè)公有的方法,其命名格式是 {action name}Action。在本例中,{action name} 應(yīng)該以小寫字母開頭。

注意

這個(gè)是習(xí)慣用法。 Zend Framework 2 并不提供其他限制性控制器,用戶必須實(shí)現(xiàn) Zend\Stdlib\Dispatchable 這個(gè)接口類。這個(gè)框架提供了兩個(gè)抽象類: Zend\Mvc\Controller\AbstractActionControllerZend\Mvc\Controller\AbstractRestfulController。我們可以使用標(biāo)準(zhǔn)的 AbstractActionController 類,如果你打算編寫一個(gè) RESTful 的 Web 服務(wù)器,AbstractRestfulController 或許更有用。

讓我們繼續(xù)在 zf2-tutorials/module/Album/src/Album/Controller 路徑下的 AlbumController.php 的文件中構(gòu)建控制器類:

namespace Album\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class AlbumController extends AbstractActionController
{
    public function indexAction()
    {
    }

    public function addAction()
    {
    }

    public function editAction()
    {
    }

    public function deleteAction()
    {
    }
}

注意

確保 Album 模塊已經(jīng)通過 config/application.config.php 注冊(cè)。你也可以為 Album 模塊提供一個(gè) Module Class,以便在 MVC 中使用。

注意

我們已經(jīng)在 module/Album/config/module.config.php 中的 ‘controller’ 部分注冊(cè)了信息。

現(xiàn)在已經(jīng)構(gòu)建了四個(gè)動(dòng)作,建立視圖就可以運(yùn)行了。每一個(gè)動(dòng)作的 URLs 如下:

URL Method called
http://zf2-tutorial.localhost/album Album\Controller\AlbumController::indexAction
http://zf2-tutorial.localhost/album/add Album\Controller\AlbumController::addAction
http://zf2-tutorial.localhost/album/edit Album\Controller\AlbumController::editAction
http://zf2-tutorial.localhost/album/delete Album\Controller\AlbumController::deleteAction

現(xiàn)在我們有一個(gè)可以工作的 router,動(dòng)作已經(jīng)建立在程序每個(gè)頁面中。

是時(shí)候建立視圖和模型層了。

初始化視圖腳本

為了往程序中集成視圖,需要?jiǎng)?chuàng)建一些視圖腳本文件。這些文件通過 DefaultViewStrategy 執(zhí)行,從控制器動(dòng)作方法返回傳遞的變量或視圖模型。這些視圖腳本存儲(chǔ)在模塊的視圖目錄中的控制器?,F(xiàn)在創(chuàng)建這四個(gè)空文件:

  • module/Album/view/album/album/index.phtml

  • module/Album/view/album/album/add.phtml

  • module/Album/view/album/album/edit.phtml

  • module/Album/view/album/album/delete.phtml

現(xiàn)在從數(shù)據(jù)庫(kù)和模型中提取數(shù)據(jù),開始填充。

上一篇:模塊下一篇:開始使用 Zend Framework 2