云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名注册_网易企业邮箱登陆入口_代金券

小七 141 0

一种新的API绑定:cloudflare-php

早在去年5月,我的一个同事在博客中介绍了我们针对Cloudflare API的Python绑定,并在Go和Node中引用了我们的其他绑定。今天,我们通过引入一个新的官方绑定(这次是用PHP)来补充这个范围。这个绑定可以通过Packagist作为cloudflare/sdk提供,您可以使用Composer安装它,只需运行Composer require cloudflare/sdk。我们在"Cloudflare PHP API绑定"知识库文章中记录了各种用例,以帮助您入门。或者,如果您希望提供帮助,或者只是在GitHub上给我们一颗星星,请随时浏览cloudflare php源代码。PHP是一种有争议的语言,毫无疑问,这种语言中有一些糟糕的设计元素(许多其他语言也是如此)。然而,不管你喜不喜欢,PHP是一种被广泛采用的语言;截至2017年9月,W3Techs的报告显示,82.8%的网站使用PHP,其服务器端编程语言是已知的。在创建这种绑定时,问题显然不是PHP的优点,而是我们是否希望帮助大量开发人员在使用PHP时改善与我们集成的开发人员的体验。为了帮助那些希望贡献或构建这个库的人,我写了这篇博文来解释在组合这个库时所做的一些设计决策。仅适用于PHP7PHP5最初引入了基于类和接口的类型暗示功能,这在PHP中开辟了(尽管很少使用)参数多态行为。基于接口的类型暗示使那些在PHP中开发的人更容易遵循四人帮的著名指导:"编程到‘接口’,而不是‘实现’。"类型暗示在PHP中发展缓慢,在php7.0中,标量类型暗示的功能是在几轮rfc之后发布的。另外,PHP7.0引入了返回类型声明,允许以类似于参数类型暗示的方式暗示返回值。在这个库中,我们广泛使用标量类型暗示和返回类型声明,从而限制了PHP5的向后兼容性。为了获得向后兼容性,这些对类型暗示的改进将无法实现,相关的好处也将丢失。由于PHP5.6不再提供主动支持,而且安全支持在PHP5.x的整个版本中消失不到一年多的时间,我们认为额外的覆盖范围不值得付出代价。对象组成软件架构是什么意思?对我来说,架构这个词传达了系统核心元素的概念,这些元素是很难改变的。其余部分必须建立的基础。马丁·福勒开始使用此包时,您会注意到需要实例化3个类:$key=new\Cloudflare\API\Auth\APIKey('示例:user.com','apiKey');$adapter=new Cloudflare\API\adapter\Guzzle($key);$user=new\Cloudflare\API\Endpoints\user($adapter);echo$user->getUserID();被实例化的第一个类称为APIKey(还有一些用于身份验证的其他类)。然后我们继续实例化Guzzle类,然后将APIKey对象注入Guzzle类的构造函数中。APIKey类实现的Auth接口相当简单:命名空间Cloudflare\API\Auth;接口身份验证{公共函数getHeaders():数组;}适配器接口(Guzzle类实现的)明确表示,在Auth接口上构建的对象将被注入构造函数:命名空间Cloudflare\API\Adapter;使用Cloudflare\API\Auth\Auth;使用Psr\Http\Message\ResponseInterface;接口适配器{...公共函数构造(Auth$Auth,字符串$baseURI);...}在此过程中,我们定义实现适配器接口的类将使用由实现Auth接口的类生成的对象组成。那么为什么我要在这里解释基本的依赖注入呢?重要的是要理解随着我们的API设计的变化,认证机制可能会独立于HTTP客户机或API端点本身而变化。类似地,HTTP客户机或API端点可以独立于所涉及的其他元素而变化。实际上,这个包已经包含了三个用于身份验证的类(APIKey、UserServiceKey和None),它们需要互换使用。因此,这个包考虑了更改API中不同组件的可能性,并试图允许这些组件独立地变化。当API端点的参数比更简单的变量类型所允许的更复杂时,也可以使用依赖注入;例如,在配置页面规则时,这样做是为了定义目标或配置:需要一次(供应商/自动加载.php');$key=new\Cloudflare\API\Auth\APIKey('mjsa@junade.com','apiKey');$adapter=new Cloudflare\API\adapter\Guzzle($key);$zones=new\Cloudflare\API\Endpoints\zones($adapter);$zoneID=$zones->getZoneID("junade.com网站");$pageRulesTarget=new\Cloudflare\API\Configurations\PageRulesTargets('https://junade.com/noCache/*');$pageRulesConfig=new\Cloudflare\API\Configurations\PageRulesActions();$pageRulesConfig->setCacheLevel('bypass');$pageRules=new\Cloudflare\API\Endpoints\pageRules($adapter);$pageRules->createPageRule($zoneID,$pageRulesTarget,$pageRulesConfig,true,6);该项目的结构总体上基于简单的对象组合;这为长期提供了一个更简单的对象模型,并提供了更高的灵活性。例如,如果我们以后想创建一个由其他端点组成的端点类,那么通过实现与其他端点类相同的接口来构建它对我们来说变得相当简单。随着更多的代码被添加,我们能够保持软件的设计相对较薄的层次。测试/模拟HTTP请求如果您有兴趣帮助贡献此存储库,有两种主要方法可以帮助您:在我们的API上构建端点覆盖范围构建那些端点类的测试覆盖率PHP-FIG(PHP框架互操作组)制定了一个如何在接口中表示HTTP响应的标准,这在PSR-7标准中有描述。这个响应接口由我们的HTTP适配器接口使用,在这个接口中,对API请求的响应被类型暗示到这个接口(Psr\HTTP\Message\ResponseInterface)。通过使用这个标准,可以更容易地为额外的HTTP客户机添加进一步的抽象,并为单元测试添加模拟HTTP响应。假设JSON响应存储在$response变量中,我们想测试IPs Endpoint类中的listIPs方法:公共函数testListIPs(){$stream=GuzzleHttp\Psr7\stream_for($response);$response=new GuzzleHttp\Psr7\response(200,['Content-Type'=>'application/json'],$stream);$mock=$this->getMockBuilder(\Cloudflare\API\Adapter\Adapter::class)->getMock();$mock->method('get')->willReturn($response);$mock->期望($this->once())->方法('get')->使用($this->equalTo('ips'),$this->equalTo([]));$ips=new\Cloudflare\API\Endpoints\ips($mock);$ips=$ips->listIPs();$this->assertObjectHasAttribute("ipv4\u cidrs",$ips);$this->assertObjectHasAttribute("ipv6\u cidrs",$ips);}我们能够通过使用标准化的PSR-7响应格式来构建适配器接口的简单模拟,当我们这样做时,我们能够定义PHPUnit期望传递给这个模拟的参数。有了一个模拟适配器类,我们就可以像测试真正的HTTP客户机一样测试IPs端点类。结论通过构建PHP的现代版本,使用良好的面向对象编程理论,并允许进行有效的测试,我们希望我们的PHP API绑定能够提供一个开发人员愉快的体验。如果您对帮助改进这个代码库的设计感兴趣,我建议您看看GitHub上的PHP-API绑定源代码(可以选择给我们一个星号)。如果您与Go或PHP合作,并且您有兴趣帮助Cloudflare将我们面向客户的高流量API转变为更加现代的面向服务的环境;我们正在旧金山、奥斯汀和伦敦招聘Web工程师。