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

模塊

Zend Framework 2 使用一個(gè)模塊系統(tǒng)來(lái)組織每個(gè)模塊內(nèi)主要的、明確的代碼。框架提供的運(yùn)用程序模塊用于提供整個(gè)程序的引導(dǎo)、錯(cuò)誤和路由配置。應(yīng)用程序模塊通常是用于提供應(yīng)用界面的控制器,比如說(shuō),應(yīng)用程序的主頁(yè),但是在本教程中我們不會(huì)使用默認(rèn)的主頁(yè),在生成模塊時(shí),我們會(huì)將專(zhuān)輯列表設(shè)置成主頁(yè)面。

我們要把所有的代碼放到包含控制器、模型、表單和視圖,以及配置的 Album 模塊當(dāng)中。我們也要根據(jù)需要調(diào)整應(yīng)用程序模塊。

從所需要的目錄開(kāi)始吧。

設(shè)置 Album 模塊

首先在 module 里創(chuàng)建一個(gè)名為 Album 的目錄,用下面的路徑對(duì)應(yīng)保存模塊的文件:

zf2-tutorial/
     /module
         /Album
             /config
             /src
                 /Album
                     /Controller
                     /Form
                     /Model
             /view
                 /album
                     /album

正如你所看到的,Album 模塊當(dāng)中有不同類(lèi)型文件的獨(dú)立目錄。位于 src/Album 目錄中包含 Album 名稱空間的 PHP 文件,這樣的模塊就可以設(shè)置多個(gè)命名空間,這是我們想要的。視圖目錄也有叫做 album 的子文件夾,用來(lái)保存我們的模塊視圖腳本。

為了安裝和配置模塊,Zend Framework 2 提供一個(gè) ModuleManager。在模塊的根目錄(module/Album)尋找 Module.php 文件,可以找到一個(gè)叫 module/Album 的類(lèi)。也就是說(shuō),給定目錄名稱,就會(huì)有對(duì)應(yīng)的類(lèi)模塊,有對(duì)應(yīng)的命名空間。

Album 模塊創(chuàng)建 Module.php 文件,在 zf2-tutorial/module/Album 創(chuàng)建一個(gè)叫 Module.php 的文件,代碼如下:

namespace Album;

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }
}

ModuleManager 將自動(dòng)調(diào)用 getAutoloaderConfig()getConfig() 函數(shù)。

自動(dòng)加載文件

我們的 getAutoloaderConfig() 函數(shù)返回一個(gè)數(shù)組,兼容 ZF2 的 AutoloaderFactory。對(duì)它進(jìn)行配置,添加一個(gè)類(lèi)映射文件給 ClassMapAutoloader 和添加此模塊的名稱給 StandardAutoloader。標(biāo)準(zhǔn)自動(dòng)加載需要一個(gè)名稱空間和在可以找到名稱空間文件的路徑。與 PSR-0 相兼容,此類(lèi)按照 PSR-0 規(guī)則直接映射到文件。

隨著我們開(kāi)發(fā)繼續(xù)進(jìn)行,我們不需要通過(guò)類(lèi)映射加載文件,所以我們提供一個(gè)空數(shù)組給類(lèi)映射自動(dòng)加載。在 zf2-tutorial/module/Album 創(chuàng)建一個(gè)叫 autoload_classmap.php 的文件:

 return array();

因?yàn)檫@是一個(gè)空數(shù)組,每當(dāng)自動(dòng)加載器在 Album 名稱空間中尋找一個(gè)類(lèi),它都會(huì)為我們返回到 StandardAutoloader。

注意

如果你使用的是 Composer,你可以只創(chuàng)建一個(gè)空的 getAutoloaderConfig(){ } 并添加到 composer.json:

"autoload": {
"psr-0": { "Album": "module/Album/src/" }
},

如果你這樣做,那么你需要運(yùn)行 php composer.phar update 去更新 composer 自動(dòng)加載文件。

配置

已經(jīng)注冊(cè)好自動(dòng)加載器,讓我們來(lái)快速地瀏覽 Album\Module 里面 getConfig() 方法。這個(gè)方法簡(jiǎn)單地加載了 config/module.config.php 文件。

zf2-tutorial/module/Album/config 創(chuàng)建一個(gè)叫 module.config.php 的文件:

return array(
     'controllers' => array(
         'invokables' => array(
             'Album\Controller\Album' => 'Album\Controller\AlbumController',
         ),
     ),
     'view_manager' => array(
         'template_path_stack' => array(
             'album' => __DIR__ . '/../view',
         ),
     ),
 );

配置信息通過(guò) ServiceManager 傳遞給相關(guān)的組件。我們需要兩個(gè)初始部分:控制器和 view_manager??刂破魈峁┝怂杏赡K提供的控制器列表。我們需要一個(gè)控制器 AlbumController,引用作為 Album\Controller\Album。所有控制器的 key 必須是唯一的,所以用模塊名稱作為前綴。

view_manager 部分,將視圖目錄添加到 TemplatePathStack 配置中。這樣它就可以找到存儲(chǔ)在 view/ 目錄下的 Album 模塊的視圖腳本。

給應(yīng)用程序通知新模塊

我們現(xiàn)在需要告訴 ModuleManager 這個(gè)新模塊的的存在。這個(gè)在基本框架應(yīng)用程序提供的配置 config/application.config.php 文件中完成。更新這個(gè)文件,以便他的模塊部分包含 Album 模塊。因此,文件現(xiàn)在看起來(lái)像這樣:

(變化需要使用注釋突顯出來(lái):)

return array(
     'modules' => array(
         'Application',
         'Album',                  // <-- Add this line
     ),
     'module_listener_options' => array(
         'config_glob_paths'    => array(
             'config/autoload/{{,*.}global,{,*.}local}.php',
         ),
         'module_paths' => array(
             './module',
             './vendor',
         ),
     ),
 );

如你所見(jiàn),在應(yīng)用程序模塊之后,我們已經(jīng)添加 Album 模塊到模塊列表當(dāng)中。

現(xiàn)在設(shè)置好模塊,準(zhǔn)備把自定義代碼放到里面。