【问题标题】:ZF2: Zend DB, TableGateway, Services StrategiesZF2:Zend DB、TableGateway、服务策略
【发布时间】:2023-03-25 09:52:01
【问题描述】:

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


注入服务方法

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

服务 > TableGateway > 工厂 > 控制器

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

【问题讨论】:

    标签: php design-patterns zend-framework2


    【解决方案1】:

    嗯,你的逻辑有点不对劲,方法其实只是

    Controller 调用 Service 调用 TableGateway

    工厂只是一个正确注入依赖的模式。

    为什么要使用服务

    抽象行为。服务一般来说是您的控制器获取数据的工具。然后服务与数据源交互。数据源是什么,您的控制器并不关心 - 甚至您的服务也不应该关心。服务应该只关心接口的实现。这样,每当您觉得不再喜欢 TableGateway 但又想使用 Doctrine2 时,您不必更改您的 Service。您不必更改控制器。您所需要更改的只是您的服务的依赖关系。不是注入 TableGateway 类,而是注入与 data-provider-dependency 的接口匹配的 Doctrine2 类。

    【讨论】:

    • 嗨 Sam,我正在尝试了解我需要在我的软件中使用哪种策略,目前看来服务方式是长期解决方案。我已经阅读了您的文档,现在更清楚了github.com/manuakasam/ZF2_3_QuickStart_Rewrite/blob/… 只是一个问题,在我的示例中,我在 PageTable 中使用 TableGateway,我是否要删除 PageTable 并使用您文档中提到的 PageService?问候
    • 不,页面表是您的页面服务的依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多