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ì)將專輯列表設(shè)置成主頁(yè)面。
我們要把所有的代碼放到包含控制器、模型、表單和視圖,以及配置的 Album
模塊當(dāng)中。我們也要根據(jù)需要調(diào)整應(yīng)用程序模塊。
從所需要的目錄開(kāi)始吧。
首先在 module
里創(chuàng)建一個(gè)名為 Album
的目錄,用下面的路徑對(duì)應(yīng)保存模塊的文件:
zf2-tutorial/
/module
/Album
/config
/src
/Album
/Controller
/Form
/Model
/view
/album
/album
正如你所看到的,Album
模塊當(dāng)中有不同類型文件的獨(dú)立目錄。位于 src/Album
目錄中包含 Album
名稱空間的 PHP 文件,這樣的模塊就可以設(shè)置多個(gè)命名空間,這是我們想要的。視圖目錄也有叫做 album
的子文件夾,用來(lái)保存我們的模塊視圖腳本。
為了安裝和配置模塊,Zend Framework 2 提供一個(gè) ModuleManager
。在模塊的根目錄(module/Album
)尋找 Module.php
文件,可以找到一個(gè)叫 module/Album
的類。也就是說(shuō),給定目錄名稱,就會(huì)有對(duì)應(yīng)的類模塊,有對(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ù)。
我們的 getAutoloaderConfig()
函數(shù)返回一個(gè)數(shù)組,兼容 ZF2 的 AutoloaderFactory
。對(duì)它進(jìn)行配置,添加一個(gè)類映射文件給 ClassMapAutoloader
和添加此模塊的名稱給 StandardAutoloader
。標(biāo)準(zhǔn)自動(dòng)加載需要一個(gè)名稱空間和在可以找到名稱空間文件的路徑。與 PSR-0 相兼容,此類按照 PSR-0 規(guī)則直接映射到文件。
隨著我們開(kāi)發(fā)繼續(xù)進(jìn)行,我們不需要通過(guò)類映射加載文件,所以我們提供一個(gè)空數(shù)組給類映射自動(dòng)加載。在 zf2-tutorial/module/Album
創(chuàng)建一個(gè)叫 autoload_classmap.php
的文件:
return array();
因?yàn)檫@是一個(gè)空數(shù)組,每當(dāng)自動(dòng)加載器在 Album
名稱空間中尋找一個(gè)類,它都會(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
。控制器提供了所有由模塊提供的控制器列表。我們需要一個(gè)控制器 AlbumController
,引用作為 Album\Controller\Album
。所有控制器的 key 必須是唯一的,所以用模塊名稱作為前綴。
在 view_manager
部分,將視圖目錄添加到 TemplatePathStack
配置中。這樣它就可以找到存儲(chǔ)在 view/
目錄下的 Album
模塊的視圖腳本。
我們現(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)備把自定義代碼放到里面。