菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块
菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块
这是涂鸦的第四篇
模块(Modules)
ZF2 是一个模块系统,而你需要在每个模块中组织你主要应用代码。由模板(skeleton)所提供的应用程序模块在整个应用程序中被用作引导(bootstrapping),错误(error)和路由设置(routing configuration)。它经常被用作提供应用级别控制,例如,应用程序的首页。但是在这个教程中我们不使用默认的模块,我们将使用唱片列表来作为应用程序的首页。
我们将代码放入唱片模块(Album Module)中,其中包含了控制台(Controller),模式(Models),表单(Form)和视图(View),当然也包含配置。
我们首先来设置必要的目录结构
一、设置唱片模块(Album Module)
首先在 module 目录下建立 Ablum 的子目录用于存放模块文件,构建前后目录对比如下图
整个 Album 目录如下
zf2-tutorial/
/module
/Album
/config
/src
/Album
/Controller
/Form
/Model
/view
/album
/album
我们将不同类型的文件保存在唱片模块(Album Module)下的不同目录里面。在 src/Ablum 目录下的 PHP 文件中所定义的类都是在名为 Album 的命名空间里,这样我们可以根据需要定义多个命名空间。在 view 目录下也有一个 album 子目录来存放视图文件。
ZF2 有一个模块管理器(ModuleManager),用来调用和配置模块。模块管理器在模块起始目录(module/Album)中查找 Module.php,找到以后再查找一个叫 Album\Module 的类。就是说目录名就是模块名,一个模块下的类拥有以模块名为名称的命名空间。
在 zf2-tutorial/module/Album 目录下建立一个 Module.php 文件,代码如下
<?php
namespace Album;
class Module
{
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)会为我们自动调用 getAutoloaderConfig() 和 getConfig()。
二、自动调用文件
getAutoloaderConfig() 返回一个与 ZF2 AutoloaderFactory 相兼容的数组。我们在 ClassMapAutoloader 里添加一个类地图文件(class map file)同时在 StandardAutoloader 中添加模块的命名空间。标准的自动调用器需要一个命名空间以及一个可以找到那个命名空间文件的路径。这样的结构符合PSR-0规则。
在本教程的开发过程中,我们不需要通过 classmap 来调用文件,所以我们在 classmap 自动调用器中设定一个空数组,步骤如下:
1、在 zf2-tutorial/module/Album 目录下新建一个 PHP 文件,并命名为:autoload_classmap.php
2、输入以下代码
<?php
return array();
当自动调用器(autoloader)在查找与 Ablum 命名空间相对应的类时,这个空数组将会返回给 StandardAutoloader。
注意:
如果是使用 composer,你可以在 composer.json 中创建一个空函数 getAutoloaderConfig() { } 来代替以上步骤
"autoload": {
"psr-0": { "Album": "module/Album/src/" }
},
如果你采用这种方法,你需要执行
php composer.phar update
命令来更新 composer 自动调用文件。
三、配置
注册完成自动调用器(autoloader)之后,我们快速浏览一下在 Album\Module 下的 getConfig() 方法,这个方法只是简单的调用了 config/module.config.php 文件。
在 zf2-tutorial/module/Album/config 目录下创建一个新PHP文件并命名为:module.config.php,其代码如下:
<?php
return array(
'controllers' => array(
'invokables' => array(
'Album\Controller\Album' => 'Album\Controller\AlbumController',
),
),
'view_manager' => array(
'template_path_stack' => array(
'album' => __DIR__ . '/../view',
),
),
);
以上的配置信息将通过 ServiceManager 传递给相关的组件。我们需要两个初始的字段:controllers 和 view_manager。
controller 字段包含了所有模块提供的控制器(controller),这里我们只需要一个在 Album\Controller\Album 中的控制器:AlbumController。控制器主键必须是唯一的,所以我们在模块名称前添加了前缀
在 view_manager 字段中我们在 TemplatePathStack 中指定了视图(view)所在目录路径,这样 Ablum 模块就可以在 view/ 目录下找到 view 的代码。
四、关于应用程序新模块的有关信息
下面介绍一下模块管理器(ModuleManager)。模板提供了 config/application.config.php 文件,将“Ablum”模块添加到这个文件的 modules 字段,代码如下:
<?php
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',
),
),
);
我们在“modules”字段下紧接着“Application”添加了“Album”
现在我们已经准备好输入我们自己的代码了。
-------------------------------------------------------------------------------------
2013-07-26补充
五、有关application.config.php的信息
application.config.php 文件是模板(Skeleton)自带的一个应用程序配置文件,保存路径是zf2-tutorial\module\Album\config\。这个配置文件直接返回一个数组,默认有三个关键字(Key),分别是:modules,module_listener_options 和 service_manager。
1、modules
modules 也是一个数组,保存的是应用程序所使用到的命名空间。例如,Album
'modules' => array(
'Application',
'Album'
),
2、module_listener_options
module_listener_options 同样是一个数组,保存的是许多有关模块管理器(ModuleManager)的监听器的选项。下面来看看每个关键字(Key)所代表的意思
(1)module_paths
这个关键字指向一个数组,这个数组包含了模块(Module)所在的路径。如果我们设定了一个模块的路径,监听器(listener)就会注意到这个模块的命名空间。这个设定的路径是指向模块(Module)的模块类(module class)
'module_paths' => array(
'./module',
'./vendor',
),
在上例中“./module”是我们创建的模块(Module)保存的路径,“./vendor”是ZF2类库所在的路径。
(2)config_glob_paths
这个关键字指向一个数组,这个数组包含了在模块(module)调用以后全局配置文件所在的路径。这个配置文件可以轻松的被模块(Module)自己的配置所覆盖。路径可以使用 GLOB_BRACE 符号
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
上例中的路径是说全局配置文件在 config/autoload/ 目录下,以 global 或者 local 结尾的 php 文件。在默认的模板( S k e l e t o n )中,这个文件是 zf2-tutorial/config/autoload/global.php
(3)config_cache_enabled
是否允许配置缓存。如果允许,合并后的配置信息会被缓存并在今后的请求中使用。默认是不允许使用缓存
//'config_cache_enabled' => $booleanValue,
(4)config_cache_key
这个关键字被用作创建配置信息缓存文件名,默认不启用
//'config_cache_key' => $stringKey,
(5)module_map_cache_enabled
是否允许模块(Module)类地图缓存。如果允许,会建立一个模板类地图缓存给今后的请求使用,目的是为了减少自动调用(autoloading)的过程,默认是不允许使用
//'module_map_cache_enabled' => $booleanValue,
(6)module_map_cache_key
这个关键字被用作创建模板类地图缓存文件名,默认不启用
//'module_map_cache_key' => $stringKey,
(7)cache_dir
合并配置信息后缓存保存的路径,默认不使用
//'cache_dir' => $stringPath,
(8)check_dependencies
是否允许使用模块(Module)依赖性检查。默认允许,防止使用有依赖关系额模块(Module)但是没有被调用
// 'check_dependencies' => true,
3、以前创建一个自己的服务管理器(Service Manager)。可能包含一个或多个子数组
//'service_listener_options' => array(
// array(
// 'service_manager' => $stringServiceManagerName,
// 'config_key' => $stringConfigKey,
// 'interface' => $stringOptionalInterface,
// 'method' => $stringRequiredMethodName,
// ),
// )
4、初始化服务管理器(ServiceManager),这将和 Zend\ServiceManager\Config 保持一致
// 'service_manager' => array(),
未完待续...谢谢