繁体   English   中英

ZF2:Zend DB,TableGateway,服务策略

[英]ZF2: Zend DB, TableGateway, Services Strategies

我创建了一个名为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

TableGateway方法

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

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

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


注入服务方法

然后,我看到有一种Service方法可以执行相同的操作,其中CRUD操作位于Service类中该类调用TableGateway类 ,并由Factory类服务注入到Controller的__construct方法中。

服务 > TableGateway > 工厂 > 控制器

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

好吧,你的逻辑有点偏离,方法实际上只是

控制器调用服务调用TableGateway

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

为什么要使用服务

抽象行为。 一般而言,该服务是控制器获取数据的工具。 然后,服务与数据源进行交互。 数据源是什么,您的控制器不在乎-甚至您的服务都不在乎。 该服务应仅在意接口的实现。 这样,每当您觉得自己不再喜欢TableGateway但想要使用Doctrine2时,就不必更改服务。 您不必更改控制器。 您只需更改服务的依赖项即可。 而不是注入TableGateway类,而是注入与数据提供者相关性的接口匹配的Doctrine2类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM