Php ZF2:Zend DB、TableGateway、服务策略

Php ZF2:Zend DB、TableGateway、服务策略,php,design-patterns,zend-framework2,Php,Design Patterns,Zend Framework2,我创建了一个名为CMS的Zend Framework 2小模块,在我的网站上写一些简单的文章。此模块使用Zend Db和TableGateway类从数据库中获取数据 我已经阅读了许多关于创建模块的策略的网站和书籍,我更喜欢使用这些文件结构的快捷方式: . ├── Module.php ├── config │   └── module.config.php ├── data │   └── data.sql ├── src │   └── Cms │   ├── Controller │

我创建了一个名为CMS的Zend Framework 2小模块,在我的网站上写一些简单的文章。此模块使用Zend DbTableGateway类从数据库中获取数据

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

.
├── 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

表格网关方法

例如,通过此文件结构,我可以在module.php中声明Page和PageTable类,并调用ServiceLocator以以下方式读取和写入数据库中的记录:

$pageTable = $this->getServiceLocator()->get('PageTable');
在这种情况下,我可以使用这个类在PageTable类中编写CRUD方法


注入服务方法

然后我看到有一种服务方式可以做同样的事情,CRUD操作位于调用TableGateway类的服务类中,并通过工厂类将服务注入到控制器

服务表格网关工厂控制器


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

你的逻辑有点不正确,实际上只有

控制器呼叫服务呼叫表格网关

工厂只是正确注入依赖项的模式

为什么要使用这项服务
抽象行为。一般来说,服务是控制器获取数据的工具。然后,服务与数据源交互。数据源是什么,你的控制器根本不在乎——连你的服务都不在乎。服务应该只关心接口的实现。这样,当您觉得不再喜欢TableGateway,但想成为医生2时,您就不必更改服务。您不必更改控制器。您所需要改变的就是服务的依赖性。您没有注入TableGateway类,而是注入与数据提供程序依赖项接口相匹配的Doctrine2类。

Hi Sam我正在尝试了解我的软件需要使用哪种策略,目前看来,服务方式是长期解决方案。我已经阅读了您的文档,现在更清楚的是一个问题,在我的示例中,我在PageTable中使用了TableGateway,我是否必须删除PageTable并使用您文档中提到的PageService?无论如何,pagetable是pageservice的依赖项。