Help us understand the problem. What is going on with this article?

PHPで超簡単APIフレームワーク

More than 3 years have passed since last update.

PHPで超簡単自作APIフレームワーク

目的

JSONの勉強

製作動機

JSONを返すって普通に言ってたけど、JSONを返すって何。。。?

対象者読者

JSONの説明をしてって言って、パッと具体的に説明できない人

事前準備

  1. JSONがそもそも何なのかわからない人はこちら
  2. urlパースがよくわからない人はURLを取得できる$_SERVER['PATH_INFO']
  3. 動的言語機能が良くわからない人は動的に呼ぶクラスを変更できる動的言語機能

関連記事

  1. PHPで超簡単自作フレームワーク

補足

ルーティング等が搭載されていないのは、本記事はあくまでJSONがメインだからです。その内ルーティングクラスやORマッパーを搭載したフレームワークも公開する予定です。

作ってみよう

今回実装する内容

1.urlの初めに来るurlに相対したcontrollerを呼ぶオートローダー機能

例:localhost/apiでリクエスト

index.php
include('./controllers/Api.php');

2.controllerはファイル名と同じクラスで作成し、その中のindex(@params)メソッドが呼ばれる
例:localhost/blogでリクエスト

controllers/Api.php
class Api
{
    public function index() : array
    {
        return array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
    }
}

ソースコード全容

index.php
<?php
if (empty($_SERVER['PATH_INFO'])) {
    exit;
}
//スラッシュで区切られたurlを取得します
$parse = explode('/', $_SERVER['PATH_INFO']);
$call = "";
foreach ($parse as $value) {
    if ($value !== "") {
        $call = $value;
        break;
    }
}
//ApiControllerをインクルードし、JSONを返します
if (file_exists('./controllers/'.$call.'.php')) {
    include('./controllers/'.$call.'.php');
    //$call名のcontrollerをインスタンス化します
    $className = "controllers\\".$call;
    $obj = new $className();
    //controllerのindexメソッドを呼びます
    $response = json_encode($obj->index());
    //ヘッダーを指定してJSONを出力
    header("Content-Type: application/json; charset=utf-8");
    echo $response;
}

解説

1.パラメーター1つ目が呼ばれるcontrollerと相対します。

require_once('./library/illuminate/Validate.php');
use library\illuminate\Validate as Validate;
if (empty($_SERVER['PATH_INFO'])) {
    exit;
}
//スラッシュで区切られたurlを取得します
$parse = explode('/', $_SERVER['PATH_INFO']);
$call = "";
foreach ($parse as $value) {
    if ($value !== "") {
        $call = $value;
        break;
    }
}

2.controllerを呼び、帰ってきた連想配列をjson_encodeを使用してJSON形式のstring型文字列に変換します

//ApiControllerをインクルードし、JSONを返します
if (file_exists('./controllers/'.$call.'.php')) {
    include('./controllers/'.$call.'.php');
    //$call名のcontrollerをインスタンス化します
    $className = "controllers\\".$call;
    $obj = new $className();
    //controllerのindexメソッドを呼びます
    $response = json_encode($obj->index());
}

3.JSONの規則に沿って記載されているstring型文字列を出力(JSONを返すってこれの事です)して終わり。

//ヘッダーを指定してJSONを出力
header("Content-Type: application/json; charset=utf-8");
header("X-Content-Type-Options: nosniff");
echo $response;

4.localhost/やlocalhost////って入力された際の対策

if (empty($_SERVER['PATH_INFO'])) {
    exit;
}

まとめ

  1. JSONとは、記載形式の規則でした。
  2. JSONを返すとは、JSON形式のstringを出力する事でした。

GitHub

https://github.com/k-okina/KahiroFramework/blob/master/index.php

参考にしたサイト

phper-oop
ペチオブはオブジェクト指向ワーキンググループです。様々なエンジニアの方に参加頂いております。
https://phper-oop.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした