justso / justapi
基于纯PHP的简单REST API。
Requires
- php: >=5.6.0
Requires (Dev)
- phpunit/phpunit: >=5.4
README
基于纯PHP的简单REST API。
它作为一个前控制器工作,调用相应的服务类来处理请求的API调用。
安装
Composer
composer require justso/justapi
git
git clone git://github.com/JustsoSoftware/JustAPI.git vendor/justso/justapi
设置
在您的根目录中创建一个包含以下属性至少的 config.json
文件
domain: FQDN of domain.
packages: List of packages to be used by the PHP autoloader. They should be located directly under 'vendor'.
services: List of services, having a pattern as key and a service locator as value.
environments: List of environments your application is going to run in, e.g. 'production' or 'development'.
服务定位器是一个PHP类名或以关键字 'file:' 开头,表示匹配此模式的服务调用由位于 'vendor' 文件夹中的另一组服务处理。'file:' 后面的名称是服务的位置。
您指定的每个环境都应该包含至少一个 AppRoot,它是服务器上代码检出的本地路径,例如 '/var/www/'。此外,它还应指定应用程序和可选的API的URL。
以下是一个这样的 config.json 文件的完整示例
{
"domain": "my-project.de",
"packages": {
"MyPackage": "/path/to/my/package"
},
"environments": {
"production": {
"approot": "/var/www/prod",
"appurl": "https://my-project.de",
"apiurl": "https://api.my-project.de",
"apipprefix": "/"
},
"integration": {
"approot": "/var/www/test",
"appurl": "https://test.my-project.de",
"apiurl": "https://test.my-project.de/api",
"apipprefix": "/api/"
},
"autotest": {
"approot": "/var/lib/jenkins/jobs/my-project/workspace",
"appurl": "https:///my-project",
"apiurl": "https:///my-project/api"
},
"development": {
"approot": "/var/www/my-project",
"appurl": "http://local.my-project.de",
"apiurl": "http://local.my-project.de/api"
}
},
"services": {
"/api/myService": "\\MyPackage\\MyService",
"/api/otherService/*": "\\OtherPackage\\OtherService"
}
}
如果使用Apache,您应该将其配置为
Alias /api /path/to/my/project/vendor/justso/justapi/FrontController.php
在NginX中,您可以使用重写
location /api/ {
rewrite ^.*$ vendor/justso/justapi/FrontController.php;
}
这应该在子目录 '/api' 上调用服务时调用前控制器。您也可以在子域中使用JustAPI,例如 'api.example.com'。
自动加载器
JustAPI 包含一个PSR-0兼容的自动加载器。建议您也用于自定义类。您只需在 config.json 文件中的 'packages' 列表中指定它们的路径即可。
系统环境
JustAPI 中所有类的一个关键元素是 SystemEnvironment
类及其 SystemEnvironmentInterface
。它是连接到所有操作系统功能的桥梁,包含有关安装、给定参数和文件系统的信息。
依赖注入容器
该包包含一个简单的依赖注入容器,可以在 /conf/dependencies.php
文件中进行配置。它应该只包含一个带有标识符的列表的 return
语句。将类名用作标识符是一个好习惯,尽管也可以使用其他名称。
如果您使用此约定并且只想创建新对象,则不需要为该对象定义。您可以通过调用 $object = $dic->get('\MyNameSpace\MyClassName');
来实例化新对象。
可以将参数数组作为 get()
调用的第二个参数提供。如果您未指定任何参数,则至少使用依赖容器的 SystemEnvironment 作为构造函数的参数。
如果您想使一个类成为单例,请在 dependencies.php
文件中使用 singleton()
函数添加一个条目
return [
'\MYNameSpace\MyClassName' => $this->singleton(MyNameSpace\MyClassName::class, [$this->env, 123])
];
这确保了每次调用 get()
都会返回相同的对象。该对象是在第一次对该对象调用 get()
时实例化的,并使用 SystemEnvironment 和构造函数参数的标量值 123
。
指定控制器类
为了实际处理API请求,您必须实现类并从 RestService 继承以处理这些请求,并在 config.json 中指定它们。因此,如果您的服务类 'My\Cool\RestService' 应该处理 '/api/my/service' 上的请求,您的 'services' 条目应如下所示
"my/service": "My\\Cool\\Service"
如果您的类应该处理像 '/api/my/service/77' 这样的调用,则条目可能包含一个通配符 (*
)
"my/service/*": "My\\Cool\\Service"
所有与模式匹配的请求都交给服务类。您还可以在服务指定的中间使用通配符,例如
"my/service/*/subservice": "My\\Cool\\Service"
服务类可以实现以下一个或多个方法:
- getAction
- postAction
- putAction
- deleteAction
输出将被放置在 $this->environment 中,永远不会被打印或输出。
从版本 2 升级
如果您从版本 2 升级,您应该在您的 config.json 文件中更改一些内容。
- 在版本 2 中,您只需要指定包名,以便自动加载器找到您的包。但这要求您的包位于
/vendor
中。这不再需要,但您需要指定包名及其位置作为packages
中的键值对。 - 路由 API 路径现在更加灵活,可以处理除
/api
之外的其他路径前缀。但您需要在您的服务规则中指定服务的完整路径。 - 已删除函数
DependencyContainerInterface::newInstanceOf()
,因此任何调用都应该替换为对 DependencyContainer 对象的get()
调用。这会影响 DependencyContainer 本身以及实现此接口的 SystemEnvironment。
支持及其他
如果您需要支持,请与我们联系: http://justso.de