ZF2:Zend DB,TableGateway,服务策略

时间:2014-05-23 07:42:19

标签: php design-patterns zend-framework2

我创建了一个名为CMS的Zend Framework 2模块来编写我网站上的简单文章。本模块使用 Zend Db TableGateway 类来获取数据库中的数据。

我已经阅读了许多关于创建模块的策略的网站和书籍,我更喜欢使用这些文件结构的简短快捷方式:

.
├── Module.php
├── config
│   └── module.config.php
├── data
│   └── data.sql
├── src
│   └── Cms
│       ├── Controller
│       │   ├── IndexController.php
│       │   ├── PageAdminController.php
│       │   └── PageCategoryAdminController.php
│       ├── Form
│       │   ├── Element
│       │   │   ├── PageCategories.php
│       │   │   └── ParentPages.php
│       │   ├── PageCategoryFilter.php
│       │   ├── PageCategoryForm.php
│       │   ├── PageFilter.php
│       │   └── PageForm.php
│       ├── Hydrator
│       │   └── Strategy
│       │       └── DateTimeStrategy.php
│       ├── Model
│       │   ├── Page.php
│       │   ├── PageCategory.php
│       │   ├── PageCategoryTable.php
│       │   ├── PageTable.php
│       │   └── UrlRewrites.php
│       └── View
│           └── Helper
│               ├── Extract.php
│               └── Tags.php
└── view
    └── cms
        ├── index
        │   ├── index.phtml
        │   ├── notfound.phtml
        │   └── page.phtml
        ├── page-admin
        │   ├── edit.phtml
        │   └── index.phtml
        ├── page-category-admin
        │   ├── edit.phtml
        │   └── index.phtml
        └── partial
            └── tags.phtml

TableGateway方法

这个文件结构允许我在module.php中声明Page和PageTable类,并调用ServiceLocator以这种方式读取和写入数据库中的记录:

$pageTable = $this->getServiceLocator()->get('PageTable');

在这种情况下,我可以使用此类在PageTable类中编写CRUD方法。


注入服务方法

然后我看到有一种服务方式可以执行相同的操作,其中 CRUD 操作位于服务类中,该服务类调用 TableGateway类并将工厂类 服务注入控制器的__construct方法。

服务> TableGateway > 工厂>的控制器

为什么我要选择服务策略而不是简单的TableGateway?

1 个答案:

答案 0 :(得分:1)

你的逻辑有点偏,实际上只是

  

控制器致电服务来电 TableGateway

Factory只是一个正确注入依赖项的模式。

为何使用服务

抽象行为。一般来说,服务是控制器获取数据的工具。然后,服务与数据源交互。数据源是什么,你的控制器并不关心 - 甚至你的服务都不应该关心。该服务应该只关心接口的实现。这样,每当你觉得你不再喜欢TableGateway但是你想要去Doctrine2时,你就不必改变你的服务。你不必改变你的控制器。您需要改变的只是服务的依赖性。您可以注入与数据提供程序依赖项接口匹配的Doctrine2类,而不是注入TableGateway类。