llwebsol / rapid
一个简单且极简的php API框架
Requires
- php: ^7.1.0
- llwebsol/easy-db: ^1.0
- vlucas/phpdotenv: ^2.4
Requires (Dev)
- phpunit/phpunit: ^7.1
README
rAPId
一个简单且极简的php API框架
入门
创建名为 YourProject
的项目
-
为您的项目创建一个空目录并进入该目录
-
使用
$ composer init
设置您的项目(需要 composer)。 -
添加到您的 composer.json
"require": {
"llwebsol/rapid": "^3.0"
},
"scripts": {
"post-update-cmd": "vendor/bin/rAPId"
},
"autoload": {
"psr-4": {
"YourProject\\": "src/"
}
}
现在运行 composer update
,必要的文件将自动添加到您的项目根目录。
Docker
默认的 Dockerfile 和 docker-compose.yml 将被添加到您的根目录。您可以按需编辑这些文件,或者使用 docker-compose up
启动默认的Docker环境。您的应用程序将在 localhost:5000
上可用
控制器
将新文件添加到新添加的 Controllers
目录(它可能在 src/Controllers 中)
示例默认控制器
(src/Controllers/Main.php):
<?php
namespace YourProject\Controllers;
use rAPId\Foundation\Controller;
class Main implements Controller
{
/**
* @return mixed
*/
public function index(){
}
}
除非您添加另一个控制器或方法,否则所有路由都将指向主控制器中的 index
方法
接下来更新您的 rAPIdConfig.php
'default_controller' => YourProject\Controllers\Main::class,
添加路由
通过添加新的控制器和新的控制器方法,可以向项目中添加路由。
示例:如果您导航到 http://www.your-project-url.com
,则将触发 Main::index() 函数。
如果您要在主控制器中添加名为 doSomething()
的函数,则导航到 your-project-url/do-something
(或者如果您更喜欢下划线,则为 your_project_url/do_something
)
您也可以通过添加新的控制器来添加新的路由
示例: (src/Controllers/SomethingElse.php)
<?php
namespace YourProject\Controllers;
use rAPId\Foundation\Controller;
class SomethingElse implements Controller
{
public function index(){
return 'You are in the Index';
}
public function anotherThing(){
return 'You are in Another Thing';
}
}
现在,导航到 http://www.your-project-url.com/something-else
将渲染 "您在索引中"
而导航到 http://www.your-project-url.com/something-else/another-thing/
将渲染 "您在 Another Thing"
输入
您可以在公共控制器方法中指定输入参数。
例如,如果您要将以下函数添加到 YourProject\Controllers\SomethingElse
public function getData($a_var = 'Not Defined', $another_var = 'Not Defined'){
return [
'A Var' => $a_var,
'Another Var' => $another_var
];
}
有三种方式接收输入。
1:
您可以直接通过URL接收数据
http://www-your-project-url.com/something-else/get-data/11/76
{
"A Var": 11,
"Another Var": 76
}
2:
您可以通过查询参数接收数据(仅通过GET请求)
http://www-your-project-url.com/something-else/get-data?another_var=76&a_var=11
{
"A Var": 11,
"Another Var": 76
}
注意 顺序无关紧要,但参数将被映射到函数中的名称。如果您的查询字符串包含在函数中未定义的键,则将忽略它
http://www-your-project-url.com/something-else/get-data?another_var=76&an_undefined_var=11
{
"A Var": "Not Definied",
"Another Var": 76
}
3:
您可以通过POST参数接收数据
示例
向 http://www-your-project-url.com/something-else/get-data
发送POST请求
带有参数 ['a_var' => 11, 'another_var' => 76]
将输出
{
"A Var": 11,
"Another Var": 76
}
与带有查询参数的GET请求类似,未定义的参数键将被忽略
注意事项
- 您可以将URL参数与GET或POST参数混合……尽管您可能不应该这样做
http://www-your-project-url.com/something-else/get-data/76?a_var = 11
将将$a_var = 11
传递给函数,并将下一个开放的参数传递值 76。
因此,没有查询字符串的相同URL将传递{ "A Var": 11, "Another Var": 76 }
$a_var = 76
到函数{ "A Var": 76, "Another Var": "Not Definied" }
- 这对于POST参数也是相同的
- 因此,对于POST请求,将忽略查询字符串
- 因此,向
http://www-your-project-url.com/something-else/get-data?a_var=11&another_var=76
发送的POST请求,如果没有在POST中提供任何数据,将输出
{ "A Var": "Not Definied", "Another Var": "Not Defined" }
- 因此,向
输出
从控制器返回的任何内容都将进行序列化,并以正确的头部返回给用户
如果你的控制器方法中没有返回任何内容,那么将不会以这种方式输出。如果你想要提供图片,请自行处理图片的输出,并不要从你的控制器中返回任何内容
你的API返回的序列化输出类型由你的 rAPIdConfig.php
文件中的 output_serializer
变量决定
目前支持JSON和XML。如果你想要输出其他类型的数据,你可以编写自己的序列化器,该序列化器实现 rAPId\Data\Serialization\Serializer
接口,然后可以自由地提交拉取请求!
数据库
rAPId 使用 llwebsol/EasyDB 包来进行简单的数据库交互
应该在项目根目录中放置一个 .env.example
文件。将此文件复制到 .env
,然后用你的数据库凭证覆盖,显然,不要将此文件提交到版本控制中
你现在可以通过调用辅助函数来访问EasyDB的一个实例
$db = db();
数据库事件监听器
你可以通过创建一个实现了 EasyDb\Events\Listener
接口的类来使用EasyDB的事件系统,然后在你的 config/database.php
中注册该监听器
示例
例如,如果你创建了一个用于更新每个数据库插入/更新的 modified_user
的监听器类
'listeners' => [
...
Event::BEFORE_SAVE => [
MyModifiedUserListener::class
],
...
]
多个数据库连接
如果你需要连接到另一个数据库,请在 .env 中添加你的新凭证
示例
...
SECONDARY_DB_HOST=mydb.path.com
SECONDARY_DB_NAME=another_db
SECONDARY_DB_USER=xyz
SECONDARY_DB_PASSWORD=123
然后更新你的 config/database.php
'primary' => [
'db_type' => env('DB_TYPE','mysql'),
'host' => env('DB_HOST'),
'db_name' => env('DB_NAME'),
'port' => env('DB_PORT'),
'user' => env('DB_USER'),
'password' => env('DB_PASSWORD'),
],
'secondary' => [
'db_type' => env('SECONDARY_DB_TYPE','mysql'),
'host' => env('SECONDARY_DB_HOST'),
'db_name' => env('SECONDARY_DB_NAME'),
'port' => env('SECONDARY_DB_PORT'),
'user' => env('SECONDARY_DB_USER'),
'password' => env('SECONDARY_DB_PASSWORD'),
]
请注意,默认情况下,db()
辅助函数将返回主数据库的连接。
要连接到上面的示例中的 "secondary"
$db = db('secondary');
其他
抛出 InvalidUrlException
将显示你的默认404页面。一旦你设置了一个默认控制器,所有无效的路由将通过该类中的 index() 方法。如果你不希望某些内容为某个随机的URL渲染,那么考虑在你的默认控制器索引中抛出此异常
示例
class Main extends Controller{
public function index(){
throw new InvalidURLException();
}
public function test($x){
return ['x' => $x];
}
}
my-site.com/xyz 将返回404响应,而 my-site.com/test 将返回有效的响应
初始化
rAPId 还会将 initialize.php 文件解压缩到你的根目录中。你可以在该文件中放置任何初始化代码。