Php API使用库-如何构造composer包

Php API使用库-如何构造composer包,php,composer-php,Php,Composer Php,一个简单的服务提供了一个API来使用它的一些特性。我想创建一个composer包,它将使用以下API,并且我希望它与其他PHP项目兼容。我读了关于这个主题的文章,并想出了使用GuzzleHttp来发出请求的想法(我在其他几个库中看到过)。然而,我对API消费库的结构感到困惑。(这是一个RESTAPI) API提供了对两种资源的访问:客户和产品 产品资源有以下方法: 列出所有可用产品-获取 添加产品-发布 删除产品-删除 客户资源具有相同的方法 到目前为止,我所做的是以下结构(我按照建议遵循p

一个简单的服务提供了一个API来使用它的一些特性。我想创建一个composer包,它将使用以下API,并且我希望它与其他PHP项目兼容。我读了关于这个主题的文章,并想出了使用
GuzzleHttp
来发出请求的想法(我在其他几个库中看到过)。然而,我对API消费库的结构感到困惑。(这是一个RESTAPI)

API提供了对两种资源的访问:
客户
产品

产品
资源有以下方法:

  • 列出所有可用产品-获取
  • 添加产品-发布
  • 删除产品-删除
客户
资源具有相同的方法

到目前为止,我所做的是以下结构(我按照建议遵循psr-4):

src/MyName/PackageName
是我在关于创建composer软件包的教程中读到的结构
MyName\PackageName
将通过它成为我的命名空间

php是一个类,它加载一些关于授权的配置(基本身份验证),并创建
GuzzleHttp\Client
的新实例。另外,我有两种构建请求的方法(设置HTTP方法、URL和其他参数)。 我还有一个
\u call()
方法,该方法实例化文件夹
资源中的新对象,数组的第一个元素作为第二个参数传递,是应该调用的方法

文件夹
Resources
包含两个文件
Products.php
Customers.php
,这两个文件是用于处理上述两个资源的所有方法的类。每个类都扩展了
Client.php

文件夹
Containers
包含用于处理来自每个资源的响应数据的文件

文件夹
Exceptions
包含过程中可能抛出的自定义异常的类

这是一个易于维护的库的好方法,还是我遗漏了这里的一些概念

如何构造composer包

长话短说:坚持使用PSR-4,决定文件夹布局,并在composer.json文件的自动加载部分公开此布局。剩下的就是:选择清晰易懂的类和方法名来公开API


你的问题是不同事物的混合,有些事物相互重叠

当谈到项目的结构时,我们必须在源代码(面向对象设计)和文件夹布局(自动加载相关)以及composer集成(带有自动加载描述)之间进行划分

让我们按顺序看一下这个

a)源代码

然而,我对API消费库的结构感到困惑。 这是一个易于维护的库的好方法,还是我遗漏了这里的一些概念

问题是:我的代码是否足够清晰和精确(对我自己和其他人来说,例如在另一个项目中使用)

建议如下:

  • 选择清晰的类和方法名称使使用变得更容易,如
    Company\PhotoApi\Client.php

    命名空间和类可能会公开供应商,例如生成源代码的个人或公司,然后可以包括API名称,最后是类名

  • 遵循一些基本的OO原则

  • 如何从API获取数据是基于味道的。使用Guzzle是可以的,而使用较轻的解决方案,如
    文件\u获取内容
    卷曲
    ,可能也会奏效。视情况而定

  • 关于可维护性:

    • 文件数量越少,代码越不复杂,可维护性越好。你需要一个例外文件夹吗?有多少文件?为什么不坚持PHP的默认异常呢 <> LI>你也可以考虑,如果API改变,你的库必须改变,对吧?如果你的库发生了变化,那么使用你的库的项目中的所有代码都必须发生变化,对吗?如果API只公开了一小部分端点,那么最好只使用一个对象并为它们提供访问器方法,而不是使用多个对象作为访问器,这可能过于细粒度。这意味着使用API的项目在升级时(可能)会有更少的行更改。无论如何:如果您的API库太难使用,您的用户会告诉您
当你有类似于:

       $PhotoApiProducts = new Company\PhotoApi\Products;
       $products = $PhotoApiProducts->get();
这也是可能的:

       $api = new Company\PhotoApi\Client;
       $products = $api->getProducts();
       $consumers = $api->getConsumers();
b)文件夹结构

我按照建议遵循psr-4

关于文件夹布局,我的建议是坚持使用PSR-4。 但是你必须自己决定确切的文件夹布局。您可以查看PSR-4标准的示例部分,以查看关于PSR-4的不同文件夹布局

c)作曲家集成

最后。。添加一个描述项目的
composer.json
文件。 自动加载部分是最重要的部分,因为这是您向Composer公开项目结构的过程

当您决定在项目中使用PSR-4时,只需在自动加载部分中这样说,然后添加从名称空间到源的映射,如

"autoload": {
        "psr-4": {
            "Foo\\Bar\\": "src/Foo/Bar/"
        }
    }

现在,Composer项目的用户必须在引导过程中加载Composer autoloader,然后他可能开始使用您的库,只需使用其中的名称空间类名,然后autoloader就可以完成工作。

您的问题很大。我很想为你写的每一段写一整篇文章,因为有太多的改进空间和你计划的很多不理想的东西。然而,大多数只是我的意见,这使得它不适合Stackoverflow。@Sven,can
"autoload": {
        "psr-4": {
            "Foo\\Bar\\": "src/Foo/Bar/"
        }
    }