上一节,学习如何使用zf2框架链接数据库,并把数据显示在视图中。由于教程较长,所以可能很多人还没有完全理解zf2中模块化开发的意思,以及它的目录结构和文件的意义,因此再用一个教程来对这些进行较详细的讲解。
我们上一节的教程中,在除了默认的application模块外,添加了一个自定义的模块album,如果你分别访问这两个模块,你会发现它们现实的是不同的内容,它们之间是互相不干扰的。我们再来着重看一下album模块的目录结构:
config文件夹存放的是含有模块配置信息的php文件,包括控制器和url路由的配置等。
src文件夹存放模块的模型和控制器,在src文件夹中含有一个与模块同名的album文件夹,在album文件夹中又含有存放模型和控制器的文件夹。
view文件夹是存放模块试图脚本的文件夹,注意在这个文件夹中含有一个与模块名称同名的子文件夹中album,在album又含有一个同样的文件夹album,在第二个album文件夹中才存放了视图脚本。
在这个示例中,其实也告诉了我们zf2模块化开发的一般过程。如果你要建立一个新的模块,只需要将album复制一份,然后将对应的文件夹改名,并且将配置文件中的模块、控制器的名称更换即可。下面我再来看一下,zf2的MVC执行流程。
我们访问的首页是http://localhost/zf/public/album/index
album是album模块的album控制器,index是控制器中的indexaction方法,我们看到了,在url中只出现了index,而不是indexaction。这个方法的函数体如下:
public function indexAction()
{
return new ViewModel(array(
'albums' => $this->getAlbumTable()->fetchAll(),
));
}
$this->getAlbumTable()获取album模块的表数据网关对象实例,然后再调用该实例的fetchAll()方法,获取相关数据。
getAlbumTable()的函数体如下:
public function getAlbumTable()
{
if (!$this->albumTable) {
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('Album\Model\AlbumTable');
}
return $this->albumTable;
}
在这个方法中,将首先获取一个服务管理器的实例-$sm,然后调用服务管理器的get方法来获取album的表数据网关对象的实例。
而’albums’实际上就是被传递给视图脚本的变量名称,它是一个对象数组,更多关于zf2操作数据库并返回值的信息需要查看zf2的官方API文档。
Album\Model\AlbumTable,这里实际上就是调用Album\Model\AlbumTable.php,在AlbumTable.php中有一个名为AlbumTable的类,这就是album模块对应的表数据网关,我们里理解为get方法返回该类的一个实例,并将其赋值给了控制器的属性。
这里再说一下一般MVC框架中的模型的概念。在一般的MVC框架中,是没有表数据网关这个概念的。我们可以简单的将zf2中的表数据网关对应于一般MVC框架的模型,因为在网关中写的就是实际处理数据操作的代码。
而album模型里还有一个文件Album.php,这个文件表示的是Album对象的一个实体。它起的是数据交换【中转】的作用,即把通过数据网关获取的数据赋值给实体。
正因为多了一个模型实体,才显得zf2与其他mvc框架与众不同,大家只要慢慢习惯了这一点,也就好了。
那么站长再列一下zf2的MVC流程:
可以简单地这么认为:
zf2->AlbumController.php->indexaction()->AlbumTable->数据库数据【省去返回箭头,因为返回的是数据】
我们的首页显示,基于的就是这样一个访问流程。
大家如果看完上一节教程,对zf2的执行流程还不够明了的,再看一看这个教程,应该就差不多理解了,其实跟一般地MVC框架差不多,无非就是zf2中的模型有模型实体和表数据网关2部分,其它的是一样的。