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