PHP code example of liuxingwei / simple-api-framework
1. Go to this page and download the library: Download liuxingwei/simple-api-framework library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
liuxingwei / simple-api-framework example snippets
namespace Application\Api\Get\Example;
use Lib\Core\Interfaces\BaseApi;
class Index implements BaseApi
{
public function run(array $params)
{
$result = [
'code' => 200,
'message' => 'OK',
'description' => "I'm a GET request.",
];
return $resut;
}
}
namespace Application\Api\Post\Example;
use Lib\Core\Interfaces\BaseApi;
class Index implements BaseApi
{
public function run(array $params)
{
$result = [
'code' => 200,
'message' => 'OK',
'description' => "I'm a POST request.",
];
return $result;
}
}
use Lib\Core\ErrorCodeTrait;
class xxx {
use ErrorCodeTrait;
public function xx(...)
{
...
$res = $this->errCode->OK;
return $res;
}
}
return [
...
'err_define_dir' => __DIR__ . '/mydefine',
'language' => 'en',
...
]
$this->errCode->OK;
$this->errCode->PARAM_MUST_NOT_EMPTY;
namespace Application\Api\Get\Example;
use Lib\Core\Interfaces\BaseApi;
use Lib\Core\ErrorCodeTrait;
class Index implements BaseApi
{
use ErrorCodeTrait;
public function run(array $params)
{
$res = $this->errCode->OK;
$res['descriptio' => "I'm GET request'];
return $res;
}
}
PARAM_NOT_EXISTS => ['code' => 403, 'message' => '参数 {{:param}} 的长度必须在 {{:min}} 到 {{:max}} 之间'];
$err = self::errCode->mapError(self::errCode->PARAM_NOT_EXISTS, ['param' => 'username', 'min' => 3, 'max' => 16]);
// 最终的输出结果为:
// {
// "code": 403,
// "message": "参数 username 的长度必须在 3 到 16 之间"
// }
public function run(array $params)
{
if ($signinSuccess) {
return [
'code' => 200,
'message' => '登录成功',
];
}
return [
'code' => 200,
'message' => '登录失败',
];
}
public $errorCode;
public function run(array $params)
{
if ($signinSuccess) {
return [
'code' => 200,
'message' => '登录成功',
];
}
$this->errorCode = '403';
return [
'code' => 403,
'message' => '登录失败',
];
}
public function run(array $params)
{
if (!$signinSuccess) {
SafException::throw([
'code' => 403,
'message' => '登录失败',
])
}
return [
'code' => 200,
'message' => '登录成功',
];
}
public function run($param)
{
......
return ['code' => '200', 'message' => 'ok'];
}
......
class xxx extends BaseApiInterface
{
public $responseType = 'html';
return "<div>这是一个html片段</div>";
}
namespace Application\Api\Get\Test;
use Lib\Core\BaseApiInterface;
class Stream implements BaseApiInterface
{
public $responseType = 'stream';
public $headers = [
'Content-Type: application/vnd.ms-excel',
'Content-Disposition: attachment;filename=test.csv',
'Cache-Control: max-age=0',
];
public function run(array $request)
{
$csv = "name,age,sex,job\nzhangsan,30,男,程序猿";
$this->headers[] = 'Content-Lenght: ' . mb_strlen($csv);
return $csv;
}
}
return [
'runtime' => 'development', // 运行环境,development 为开发环境,test 为测试环境,product 为生产环境
'api_path' => '/Api',
'db' => [ // 数据库配置
'dbms' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'user' => 'root',
'password' => '123456',
'dbname' => 'sampledb',
],
'second_db' => [
'dbms' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'user' => 'root',
'password' => '123456',
'dbname' => 'jol',
],
'di_config' => [ // PHP-DI 定义配置,可以是定义文件名,也可以是定义文件名数组
__DIR__ . '/di_config.php',
],
'debug' => true, // 是否开启 debug,开启 debug 后,可以在提交中带有 debug 参数,返回的数据中将有 debug 项
];
$_ENV['config']['runtime']; // 'development'
$_ENV['config']['db']['host']; // 'localhost'
CONFIG['runtime'];
CONFIG['db']['host'];
return [
'db' => [
'host' => '10.0.0.1',
'password' => '@77pai*654'
],
'second_db' => [
'host' => '10.0.0.1',
'password' => '@77pai*654'
]
];
// application/Model/User.php
namespace Application\Model;
use Lib\Core\BaseModel;
class User extends BaseModel
{
public function checkUser($userName, $password)
{
return $this->where('user_name = :user_name AND password = :password', [':user_name' => $userName, ':password' => $password])->selectOne();
}
}
// application/Model/UserInfo.php
namespace Application\Model;
use Lib\Core\BaseModel;
class UserInfo extends BaseModel
{
protected $table = 'user_info';
public function checkUser($userName, $password)
{
return $this->where('user_name = :user_name AND password = :password', [':user_name' => $userName, ':password' => $password])->selectOne();
}
}
// application/Model/UserInfo.php
namespace Application\Model;
use Lib\Core\BaseModel;
class UserInfo extends BaseModel
{
public function checkUser($userName, $password)
{
return $this->where('user_name = :user_name AND password = :password', [':user_name' => $userName, ':password' => $password])->selectOne();
}
}
// application/Model/UserInfo.php
namespace Application\Model;
use Lib\Core\BaseModel;
/**
* @Scope('prototype')
*/
class UserInfo extends BaseModel
{
.....
}
'api_path' => '/Api'
'cross_domain' => [
'enable' => true,
'domain' => 'http://192.168.1.25:8080',
'methods' => 'POST, GET, PUT, DELETE, PATCH',
'headers' => 'sign, key',
];
/**
* ......
* @Required("user_name")
* @Required("password")
*/
public function run($params)
{
...
}
/**
* ......
* @NotEmpty("description")
*/
public function run($params)
{
...
}
/**
* ......
* @Required("user_name")
* @NotEmpty("user_name")
*/
public function run($params)
{
...
}
/**
* .....
* @NotEmpty("user_name", trim=true)
*/
public function run($params)
......
/**
* ......
* @Length("password", max=16, min=9)
*/
public function run($params)
......
/**
* ......
* @Limit("price", min=12.5, max=13.3)
*/
public function run($params)
......
/**
* ......
* @Rule("ip", rule=".*?@.*?\..*?", error={"message":"参数 \"IP\" 不是合法的 IP 地址"})
*/
public function run($params)
......
use Lib\Validations\AbstractValidation`;
/**
* @Annotation
* @Target({"METHOD"})
*/
class MyValidation extends AbstractValidation {
......
}
......
class MyValidation extends AbstractValidation
{
......
public function check(array $params)
{
if (...) { // 校验失败的处理
$this->err = [
'code' => 10086,
'message' => '客服小姐姐脾气太大'
];
return false;
}
return true;
}
}
......
class MyValidation extends AbstractValidation
{
public function check(array $params)
{
$this->value;
......
}
}
......
class MyApi implements BaseApiInterface
{
/**
* @MyValidation(value="username")
*/
public function run($params)
{
}
}
class MyApi1 implements BaseApiInterface
{
/**
* @MyValidation("username")
*/
public function run($params)
{
......
}
}
namespace Application\Validations;
use Lib\Validations\AbstractValidation;
/**
* 利用正则校验参数是否符合规则
* @Annotation
* @Target({"METHOD"})
*/
class MyValidation extends AbstractValidation
{
/**
* 出错时的自定义消息
* @var array
*/
public $error = null;
/**
* 校验用的正则表达式
* @var string
*/
public $rule;
public function check(array $params)
{
if (key_exists($this->value, $params)) { // 判断要校验的参数在给出的参数中是否存在,存在才需要校验
if (preg_match('/' . $this->rule . '/', $params[$this->value])) { // 用给定的正则进行匹配,成功返回 true
return true;
} else { // 失败对 $this->err 进行设置,并返回 false
$code = (key_exists('code', $this->error)) ? $this->error['code'] : 10086;
$message = (key_exists('message', $this->error)) ? $this->error['message'] : '参数格式不符合要求';
$this->err = [
'code' => $code,
'message' => $message
];
return false;
}
} else { // 要校验的参数不存在,无需校验直接返回 true
return true;
}
}
}
use Application\Api\Get\Test;
use Lib\Core\BaseApiInterface;
use Lib\Core\ErrorCodeTrait;
class Index implements BaseApiInterface
{
use ErrorCodeTrait;
/**
* ......
* @MyValidation("ip", rule="^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", error={"code":"10090","message":"不是合法的IP地址"})
*/
public function run($params)
{
......
}
}
return [
...
'validation_namespaces' => [
'Application\Validations',
],
...
];
Shell
git clone https://github.com/Liuxingwei/php-simple-api-framework.git
Shell
>cd safpath/public
>php -S localhost:xxxx index.php
text
GET /example/index => Application\Api\Get\Example\Index
POST /user-info/create-user => Application\Api\Post\UserInfo\CreateUser
PUT /user-info/modify-user => Application\Api\Put\UserInfo\ModifyUser