laravel-fake-api

yml形式のファイルを使ってLaravelにAPIのモック環境を構築するライブラリ

  • Fakerのメソッドを使ってランダムな値を返せます。
  • レイアウト機能を使えば共通のレイアウトを返すことができます。
  • LaravelのValidationルールが使えます。
  • authをtrueにすることでBearer認証を有効にできます。
  • repeatCountを指定すれば連続の値を出力できます。

LaravelのRoute定義ファイルで初期化してください。

try {
    
    $file = new StorageFile();
    $parser = YmlParser::createFromFile($file, "./fakeapi/api-config.yml");

    FakerApi::setLang("ja_JP");
    FakerApi::registRoute($parser->getPaths());

} catch (ConfigFileValidationErrorException $e) {
    foreach($e->getMessages() as $message) {
        print($message . "\n");
    }
} catch (Exception $e) {
    echo $e->getMessage();
}

api-config

APIの設計はyml形式で行う。

fakeapi: 1.0.0

layout:

  success: |
    { 
      "code": "200",
      "message": "ok",
      "data": [
        %data%
      ]
    }

  error: |
    {
      "code": "203",
      "message": "error",
      "data": %data%
    }

paths:
  /demo/me:
    get:
      description: 単体のユーザー情報を返す
      statusCode: 201
      layout: success
      auth: false
      responseJson: |
        {
          "numberBetween": %rand_numberBetween(3,4)_1%,
          "id": "%id%",
          "word": "%rand_word%",
          "isbn10": "%rand_isbn10%",
          "uuid": "%rand_uuid%",
          "prefecture": "%rand_prefecture%",
          "ipv4": "%rand_ipv4%",
          "year": "%rand_year%",
          "day": "%rand_day%",
          "month": "%rand_month%",
          "time": "%rand_time%",
          "kanaName": "%rand_kanaName%",
          "firstKanaName": "%rand_firstKanaName%",
          "lastKanaName": "%rand_lastKanaName%",
          "company": "%rand_company%",
          "latitude": %rand_latitude%,
          "longitude": %rand_longitude%,
          "realText": "%rand_realText(50)%",
          "boolean": %rand_boolean_1%,
          "boolean": %rand_boolean_2%,
          "isbn13": "%rand_isbn13%",
          "mail": "%rand_email_1%",
          "name" : "%rand_name%",
          "password": "%rand_password_1%",
          "address": "%rand_city% %rand_streetAddress_1% %rand_postcode% ",
          "phoneNumber": "%rand_phoneNumber_1%",
          "country": "%rand_country%",
          "url" : "%rand_url_11%",
          "city": "%rand_city%",
          "gender": {
            "hoge": "%rand_randomElement(男,女)%",
          },
          "mobile_number": "%rand_randomElement(090,080)_1% - %rand_randomNumber(4)_1% - %rand_randomNumber(4)_1%",
          "mobile_number": "%rand_randomElement(090,080)_2% - %rand_randomNumber(4)_2% - %rand_randomNumber(4)_2%",
          "rand_number": %rand_randomNumber(9)%,
          "pet": "%rand_randomElement(犬, 猫)%",
          "id": %rand_randomElement(1, 2)%,
          "creditCardNumber": "%rand_creditCardNumber%",
        }
      requestBody: 
        name: required|max:5
        mail: required|max:20

    post:
      description: 単体のユーザー情報を返す
      statusCode: 200
      auth: false
      responseJson: |
        {
          "id": "%id%",
          "mail": "%rand_safeEmail%",
          "name" : "%rand_name%"
        }
      requestBody: 
          name: required|max:5
          mail: required|max:20
  
  /demo/mqtt:
    get:
      description: mqttを単体で取得
      statusCode: 200
      responseJson: |
        {
          "id": "%id%",
          "mail": "%rand_safeEmail%",
          "name" : "%rand_name%"
        }
      requestBody:
          id: required
  
  /demo/goal:
    get:
      description: 単体のユーザー情報を返す
      method: GET
      layout: error
      statusCode: 200
      repeatCount: 5
      responseJson: |
        {
          "incrementId": %increment_id%,
          "goal": {
            "goalType": "%rand_randomElement(LOSE, GAIN)%",
            "startDate": "2018-06-13",
            "startWeight": %randomFloat(3,0,10)%,
            "weight": %randomFloat(3,0,10)%,
            "weightThreshold": %randomFloat(3,0,10)%
          }
        }
      requestBody: 
          user-id: required
          goal-type: required

suffixを使えば、同じメソッド名で異なるランダムな値を返すことができます

メソッド名_1, メソッド名_2, メソッド名_3

Generators Method

method name random value
rand_name 漢字のフルネーム
rand_firstName 名前
lastName 名字
rand_kanaName カタカナのフルネーム
rand_firstKanaName カタカナの名前
rand_lastKanaName カタカナの名字
rand_country
rand_prefecture
rand_year
rand_month
rand_day
rand_time 時刻
rand_mail メール
rand_boolean Boolean
rand_realText(int digit) ランダムな文字列
rand_company 会社名
rand_city
rand_postcode 郵便番号
rand_streetAddress 番地
rand_latitude 緯度
rand_longitude 経度
rand_password パスワード
rand_phoneNumber 携帯番号 or 家の電話
rand_url URL
rand_ipv4 IPアドレス
rand_isbn10 International Standard Book Number(10)
rand_isbn13 International Standard Book Number(13)
rand_creditCardNumber クレジットカード
increment_id repeatCountを指定した時に連番のIDが出力されます
rand_numberBetween(int,int) 引数に指定した範囲からランダムな数字を返します
rand_randomFloat(少数桁数, 最小値, 最大値) ランダムな浮動小数点数を一つ返す
rand_randomElement(A,...B) 引数に指定した値からランダムで一つ返す

Created by araiyusuke