LoginSignup
1
1

More than 5 years have passed since last update.

phalconのチュートリアル学習記録

Last updated at Posted at 2018-04-04

phalconのチュートリアル「REST」を解剖しながらみていきます。

macでXAMPPの上で動かしています。

チュートリアル-Creating a Simple REST API編-

全てを解剖した上で、知っておくべき知識がやっとわかったので、
以下の内容をコンプリートしてから先に進みましょう笑笑

でも、まだよくわからないことだらけなので、わからない部分はごめんなさい、笑

Phalconモデルまとめ(1)データ取得の基本
よく見るHTTPステータスコード一覧とその意味を理解する
HTTPについて
クラスPhalcon \ Http \ Response ⇦レスポンスの部分
PhalconのHTTPリクエスト

ファイル構造

ファイル構造はこんな感じです。チュートリアルと一緒

my-rest-api/
    models/
        Robots.php
    index.php
    .htaccess

.htaccessを作る

これは良く分からんので、コピペで。

my-rest-api/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

index.phpを作る

分解していきます。

my-rest-api/index.php
<?php

use Phalcon\Loader; //オートローダー使うよ!って宣言
use Phalcon\Mvc\Micro;  //マイクロフレームワークのようなアプリケーションを作成する
use Phalcon\Di\FactoryDefault; //Phalconに付属しているコンポーネントのほとんどを登録するための宣言
use Phalcon\Db\Adapter\Pdo\Mysql as PdoMysql; //mysqlを使う

// Use Loader() to autoload our model
$loader = new Loader(); //オートローダーを作る

$loader->registerNamespaces( //名前空間を定義する
    [
        'Store\Toys' => __DIR__ . '/models/', //store\Toysを定義。「/models/」以下のディレクトリをロードする
    ]
);

$loader->register(); //上で定義したオートローダーを登録

$di = new FactoryDefault(); //DIを作る

// Set up the database service
$di->set(
    'db',  //データベースを定義
    function () {
        return new PdoMysql(
            [
                'host'     => 'localhost', //XAMPPならlocalhost
                'username' => 'root',  //使用するデータベースの名前を記す
                'password' => 'secret',  //使用するデータベースのパスワードを記す
                'dbname'   => 'robotics', //使用するデータベースの名前を記す
            ]
        );
    }
);

// Create and bind the DI to the application
$app = new Micro($di); //appというマイクロを作って??DIと結びつける

my-rest-api/index.php
// Retrieves all robots
//データの検索の定義
$app->get(
    '/api/robots', //検索する際は「/api/robots」を使う!
    function () use ($app) {
        $phql = 'SELECT * FROM Store\Toys\Robots ORDER BY name'; //Store\Toys\Robotsから、全ての情報を取り出す(名前順に)という作業を変数phqlに代入

        $robots = $app->modelsManager->executeQuery($phql); //さっきのphqlを実行します。

        $data = []; //空のdataを作ります。

        foreach ($robots as $robot) { 
            $data[] = [
                'id'   => $robot->id, //全てのrobotのidとnameをdataに格納します
                'name' => $robot->name, 
            ];
        }

        echo json_encode($data); //dataをjson形式にして表示
    }
);

JSON形式ってなんやったっけ・・・

要するに「JavaScriptの中でオブジェクトを記述する書式」のことです。

JSONというのは「データを表現するための記法(≒文法)」です。

らしいです。笑

my-rest-api/index.php
// Searches for robots with $name in their name
$app->get(
    '/api/robots/search/{name}', 名前で検索するのは/api/robots/serch/{name}
    function ($name) use ($app) {  
        $phql = 'SELECT * FROM Store\Toys\Robots WHERE name LIKE :name: ORDER BY name'; //Store\Toys\Robotsから、全ての情報を取り出す(名前順に)という作業を変数phqlに代入

        $robots = $app->modelsManager->executeQuery( //先ほどのphqlを実行
            $phql,
            [
                'name' => '%' . $name . '%'  //なんじゃこりゃ??
            ]
        );

        $data = []; //空のデータを作成

        foreach ($robots as $robot) {
            $data[] = [
                'id'   => $robot->id,  //さっき抽出したやつのidとnameをdataに格納します
                'name' => $robot->name,
            ];
        }

        echo json_encode($data); //dataをjson形式にして表示
    }
);
my-rest-api/index.php
use Phalcon\Http\Response;

// Retrieves robots based on primary key
$app->get(
    '/api/robots/{id:[0-9]+}', //主キーで検索するのは「/api/robots/{id:[0-9]+}」を使う
    function ($id) use ($app) {
        $phql = 'SELECT * FROM Store\Toys\Robots WHERE id = :id:'; //「Store\Toys\Robots」から全てのIDを取り出す。

        $robot = $app->modelsManager->executeQuery( //先ほどのphqlを実行
            $phql,
            [
                'id' => $id, //idを表示?代入?
            ]
        )->getFirst(); //最初のレコードを取得

        // Create a response
        $response = new Response(); responseを作る

        if ($robot === false) { //もし変数robotがなかったら
            $response->setJsonContent( 
                [
                    'status' => 'NOT-FOUND' //ステータスを404 NOT FOUNDにする
                ]
            );
        } else {
            $response->setJsonContent( 
                [
                    'status' => 'FOUND', 
                    'data'   => [
                        'id'   => $robot->id, //dataにidとnameを格納
                        'name' => $robot->name
                    ]
                ]
            );
        }

        return $response; responseを返す
    }
);

my-rest-api/index.php
// Adds a new robot 新しいのを入れる
$app->post(
    '/api/robots', POSTには/api/robotsを使う
    function () use ($app) {
        $robot = $app->request->getJsonRawBody(); //POSTのbodyを取得する機能を$robotに持たせます

        $phql = 'INSERT INTO Store\Toys\Robots (name, type, year) VALUES (:name:, :type:, :year:)'; //phqlは、「Store\Toys\Robots」に「name」「type」「year」を追加

        $status = $app->modelsManager->executeQuery(
            $phql,
            [
                'name' => $robot->name, //phqlを実行し、nameに名前をtypeにタイプを、yearに年を代入
                'type' => $robot->type,
                'year' => $robot->year,
            ]
        );

        // Create a response
        $response = new Response(); //responseを作る

        // Check if the insertion was successful
        if ($status->success() === true) {  //successはフラッシュメッセージ
            // Change the HTTP status
            $response->setStatusCode(201, 'Created'); //ステータスのコード設定 404のNOTFOUNDみたいな感じで、201のCreatedを設定しているのだろう。

            $robot->id = $status->getModel()->id; //$robotに先ほどのstatusの現在のモデル状況からidを参照します。

            $response->setJsonContent( //HTTPレスポンスの本文を作成する
                [
                    'status' => 'OK',  //statusがokの場合はリクエストがなんの問題もなく受理されます
                    'data'   => $robot, //dataに先ほどのrobotを代入
                ]
            );
        } else {
            // Change the HTTP status
            $response->setStatusCode(409, 'Conflict'); //ステータスコードを409のConflictに設定

            // Send errors to the client
            $errors = []; //エラーメッセージを入れるようの空箱を用意

            foreach ($status->getMessages() as $message) { //ステータスのエラーメッセージを取得
                $errors[] = $message->getMessage(); // errorsに格納
            }

            $response->setJsonContent( //HTTPレスポンスの本文を作成する
                [
                    'status'   => 'ERROR',//ステータスをエラーにして
                    'messages' => $errors, //エラーメッセージをmessagesに代入
                ]
            );
        }

        return $response; responseを返す
    }
);
my-rest-api/index.php
// Updates robots based on primary key アップデート
$app->put(
    '/api/robots/{id:[0-9]+}', 
    function ($id) use ($app) {
        $robot = $app->request->getJsonRawBody(); //POSTのbodyを取得する機能を$robotに持たせます

        $phql = 'UPDATE Store\Toys\Robots SET name = :name:, type = :type:, year = :year: WHERE id = :id:'; //それぞれアップデート

        $status = $app->modelsManager->executeQuery( //先ほどのphqlを実行
            $phql,
            [
                'id'   => $id, //それぞれ代入
                'name' => $robot->name,
                'type' => $robot->type,
                'year' => $robot->year,
            ]
        );

        // Create a response
        $response = new Response(); //レスポンスを作成

        // Check if the insertion was successful
        if ($status->success() === true) {
            $response->setJsonContent( //ステータスがうまくいったら
                [
                    'status' => 'OK' //ステータスをOKにする
                ]
            );
        } else {
            // Change the HTTP status
            $response->setStatusCode(409, 'Conflict'); //うまくいかなければ、409のConflictにする

            $errors = []; //エラーを格納する空箱を用意

            foreach ($status->getMessages() as $message) { //エラーメッセージを取得して、
                $errors[] = $message->getMessage(); //errorsに代入
            }

            $response->setJsonContent( //HTTPレスポンスの本文を作成する
                [
                    'status'   => 'ERROR', //ステータスをエラーにして
                    'messages' => $errors, //エラーメッセージを表示?
                ]
            );
        }

        return $response; //レスポンスを返す
    }
);
my-rest-api/index.php
// Deletes robots based on primary key 削除
$app->delete(
    '/api/robots/{id:[0-9]+}',
    function ($id) use ($app) {
        $phql = 'DELETE FROM Store\Toys\Robots WHERE id = :id:'; //削除なので、DELETEがありますね

        $status = $app->modelsManager->executeQuery( //先ほどのphqlを実行
            $phql,
            [
                'id' => $id, //idを表示??
            ]
        );

        // Create a response
        $response = new Response();

        if ($status->success() === true) { //うまくいったら
            $response->setJsonContent( //HTTPレスポンスの本文を作成する
                [
                    'status' => 'OK' //ステータスをOKにする
                ]
            );
        } else { //うまくいかなければ
            // Change the HTTP status
            $response->setStatusCode(409, 'Conflict'); //ステータスを409のConflictにする

            $errors = []; //エラーを格納する空箱を作って

            foreach ($status->getMessages() as $message) { //エラーメッセージを取得し
                $errors[] = $message->getMessage(); //errorsに代入
            }

            $response->setJsonContent( //HTTPレスポンスの本文を作成する
                [
                    'status'   => 'ERROR', //ステータスをERRORにして
                    'messages' => $errors, //エラーメッセージを表示?
                ]
            );
        }

        return $response; //responseを返す
    }
);
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1