baghayi/http-verb-extraction

用于从Apigility中使用的资源中提取HTTP动词到它们自己的类中的Zf2模块。

v0.1.0 2015-01-17 11:18 UTC

This package is auto-updated.

Last update: 2024-08-29 03:55:56 UTC


README

介绍

简单来说,这个模块所做的是提取每个http动词(如我所说),例如 create(用于对集合进行发布),deletefetchAlldeleteList,... 到它们自己的类中。

好吧,我已经在Apigility周围捣鼓了一段时间了,最近我选择在一个我们开始的项目中使用它。我不喜欢的事情,而这个模块试图解决的是,在资源类中,我们有很多方法,每个方法都对应一个http方法(http动词),无论是集合还是实体。如 createdeletefetchAll,... 等方法。

在我看来,这就像一个包含很多动作的控制器。这与我信奉的理念相反,即一个控制器一个动作。你可能已经猜到了这里的问题。那就是我肯定不会一次调用多个动作。但是,这些方法所依赖的对象必须传递给相应的类,这样它才能在需要的时候开始工作。

明确地说,我所面临的问题是,我必须传递很多对象给类,以便其中的一些可能被它的一些方法调用。听起来它违反了单一职责原则。即相应的类可能有多个任务要做。

公平地说,我需要提到的是,我看到有些人传递一个mapper对象给类,这是一个唯一的对象。但对我来说,这感觉像是把问题推给别人,另一个对象,而且根本就没有解决问题。

通过创建这个模块,我的目标是解决这个问题。

不幸的是,我对apigility的内部结构并不完全熟悉,所以我无法提出更好的解决方案。我的意思是,这个模块有一些我不喜欢的地方,但可以通过更改apigility来解决,但这不是我现在想要的。它们可能以更好的方式解决,但我不熟悉。

我将提到这些问题,但现在还是先谈谈(写写)。看看我们有什么。

安装

首先,你需要手动下载此模块,使用git或通过composer。建议使用composer,但选择权在你。

如果你使用composer,它将默认将模块下载到vendor/目录。如果你手动下载或使用git克隆,那么你需要将其放置在vendor/目录中,就像composer做的那样。

然后,你需要将HttpVerbExtraction添加到你的config/application.config.php文件中的'modules'键下。

  • 要使用composer安装,你需要在项目根目录下运行以下命令

    composer require "baghayi/http-verb-extraction:dev-master"

  • 如果你想要直接使用git克隆,你需要在vendor/目录下(或你模块将要加载的任何地方)运行以下命令

    git clone https://github.com/baghayi/HttpVerbExtraction

  • 你还可以通过点击'下载ZIP'按钮或使用此URL下载模块,然后将其移动到vendor/目录并解压缩

    https://github.com/baghayi/HttpVerbExtraction/archive/master.zip

现在你已经准备好了。

使用方法

为了使用此模块,你需要采取以下步骤

  • 在您的资源类中,将 ZF\Rest\AbstractResourceListener 替换为该模块提供的 HttpVerbExtraction\Rest\AbstractResourceListener

例如:如果您的API模块名称是 DemoApi,则其资源类位置应为 DemoApi\V1\Rest\Demo\DemoResource.php(对于REST资源)。这个类在apigility中默认扩展了 ZF\Rest\AbstractResourceListener。您需要将其更改为 HttpVerbExtraction\Rest\AbstractResourceListener

  • 资源类中的任何方法都是无用的,您可以将其全部删除,因为它们不会被该模块使用。

  • 对于每个HTTP动词,例如 createfetch 等,您需要创建一个专门的类来实现 HttpVerbExtraction\DispatchableInterface.php 接口。

  • 然后您需要在主服务管理器中定义之前创建的类作为服务。

  • 创建每个HTTP动词(createdelete 等)的服务后,您需要将它们关联起来。为此,您需要在模块的配置文件中创建一个数组,如下所示

    'http-verb-extraction' => array(
        'Name of virtual controller (checkout zfcampus/zf-rest module out)' => array(
            'create'      => 'A service name',
            'delete'      => 'A service name',
            'deleteList'  => 'A service name',
            'fetch'       => 'A service name',
            'fetchAll'    => 'A service name',
            'patch'       => 'A service name',
            'patchList'   => 'A service name',
            'replaceList' => 'A service name',
            'update'      => 'A service name',
        ),
        // Repeat for each controller
    ),

如您所见,在模块配置文件中,您需要创建一个键为 http-verb-extraction 的数组,它包含另一个数组。

嵌套数组的键必须是资源控制器的名称,该名称可以在您的API模块的资源配置文件中找到。

在我们的示例中,我们的 DemoApi 的控制器名称应该是这样的:DemoApi\\V1\\Rest\\Demo\\Controller(对于REST资源)。

如您所见,嵌套数组由例如 createdeletedeleteList 等元素的元素组成,每个HTTP动词,它们的值必须是之前创建的服务的名称。

您还可以删除不需要或未使用的动词。

特质

在这个模块中,大约有5个特质可供使用。这些特质可以用在为HTTP动词创建的类中。

  • HttpVerbExtraction\Traits\Data 用于获取用户发送到您的API的数据。
  • HttpVerbExtraction\Traits\Identifier 用于获取实体的ID。
  • HttpVerbExtraction\Traits\Identity 用于获取身份对象。
  • HttpVerbExtraction\Traits\InputFilter 用于获取inputFilter。
  • HttpVerbExtraction\Traits\QueryParams 用于获取用户在URL中指定的查询参数。

所有这些特质中只有一个方法,用于执行它们应该完成的任务。

但是,您不一定需要使用这些特质。您可以直接在动词类中获取这些特质提供的值。

实现 HttpVerbExtraction\DispatchableInterface.php 接口的动词类将获得 ResourceEvent 作为其 dispatch 方法的参数。所有由特质提供的值都可以通过传递到您类的event直接检索。

如果您不确定如何像特质一样获取指定的值,您可以查看特质的源代码,因为它们非常直观易懂。

此外,特质中定义的方法需要传递事件对象,以便它们可以执行它们应该执行的操作。

服务

  • HttpVerbExtraction\Service\ControllerName 用于获取当前资源的控制器名称。

  • HttpVerbExtraction\Service\CollectionClass 用于获取当前资源的集合类名称。

  • HttpVerbExtraction\Service\EntityClass 用于获取当前资源的实体类名称。

  • HttpVerbExtraction\Service\VerbServiceName 用于获取配置文件中定义的动词的服务名称。

初始化器

目前只有一个初始化器,它用于资源类扩展的抽象类中,用于在其中提供 HttpVerbExtraction\Rest\DispatchVerb 对象,以便它可以将其事件(如 createfetch 等)附加到其 dispatch 方法上。

  • HttpVerbExtraction/Initializer/DispatchVerbAwareInterface.php

问题

1- 我认为需要关注的一点是ResourceClass及其工厂类。由于开发者不再处理它们,我认为可以将它们移动或删除,以便从开发者(Apigility用户)那里隐藏起来。它们不需要展示给开发者。

或许有更好的解决方案,但遗憾的是,目前我并不清楚。

2- 我引入的http-verb-extraction数组键可以与配置文件中的zf-rest键合并,但我不想自己引入新的内容(作为一个外人,不是Apigility主要开发人员)。尽管它能完成工作,但仍需要一个合适的归属。

谢谢 :)