baghayi / http-verb-extraction
用于从Apigility中使用的资源中提取HTTP动词到它们自己的类中的Zf2模块。
Requires
- php: >=5.3.23
This package is auto-updated.
Last update: 2024-08-29 03:55:56 UTC
README
介绍
简单来说
,这个模块所做的是提取每个http动词(如我所说),例如 create
(用于对集合进行发布),delete
,fetchAll
,deleteList
,... 到它们自己的类中。
好吧,我已经在Apigility周围捣鼓了一段时间了,最近我选择在一个我们开始的项目中使用它。我不喜欢的事情,而这个模块试图解决的是,在资源类中,我们有很多方法,每个方法都对应一个http方法(http动词),无论是集合还是实体。如 create
,delete
,fetchAll
,... 等方法。
在我看来,这就像一个包含很多动作的控制器。这与我信奉的理念相反,即一个控制器一个动作。你可能已经猜到了这里的问题。那就是我肯定不会一次调用多个动作。但是,这些方法所依赖的对象必须传递给相应的类,这样它才能在需要的时候开始工作。
明确地说,我所面临的问题是,我必须传递很多对象给类,以便其中的一些可能被它的一些方法调用。听起来它违反了单一职责原则。即相应的类可能有多个任务要做。
公平地说,我需要提到的是,我看到有些人传递一个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动词,例如
create
、fetch
等,您需要创建一个专门的类来实现HttpVerbExtraction\DispatchableInterface.php
接口。 -
然后您需要在主服务管理器中定义之前创建的类作为服务。
-
创建每个HTTP动词(
create
、delete
等)的服务后,您需要将它们关联起来。为此,您需要在模块的配置文件中创建一个数组,如下所示
'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资源)。
如您所见,嵌套数组由例如 create
、delete
、deleteList
等元素的元素组成,每个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
对象,以便它可以将其事件(如 create
、fetch
等)附加到其 dispatch
方法上。
HttpVerbExtraction/Initializer/DispatchVerbAwareInterface.php
问题
1- 我认为需要关注的一点是ResourceClass及其工厂类。由于开发者不再处理它们,我认为可以将它们移动或删除,以便从开发者(Apigility用户)那里隐藏起来。它们不需要展示给开发者。
或许有更好的解决方案,但遗憾的是,目前我并不清楚。
2- 我引入的http-verb-extraction数组键可以与配置文件中的zf-rest键合并,但我不想自己引入新的内容(作为一个外人,不是Apigility主要开发人员)。尽管它能完成工作,但仍需要一个合适的归属。