oikynブログ

エンジニアの技術ブログ。主にWEB、iOS、サービス、ツールなどなど。

Phalcon 1.2.4 (PHP Framwork)::APIスケルトン

Phalcon

Phalcon Frameworkを利用してAPIを実装したときのスケルトンを紹介します。

本家ドキュメントでは、
http://docs.phalconphp.com/en/latest/reference/micro.html
を参考にしました。

ディレクトリ・ファイル構成

基本構成は、Phalcon Developer Toolsを使用して作成しました。

phalcon-micro
│  .htaccess
│  app.php
│
├─.phalcon
├─app
│  ├─collections
│  │      UserCollection.php
│  │
│  ├─config
│  │      config.php
│  │      loader.php
│  │      services.php
│  │
│  ├─controllers
│  │      ControllerBase.php
│  │      UserController.php
│  │
│  ├─models
│  └─views
│
├─logs
│
└─public
    │  .htaccess
    │  index.php
    │
    ├─css
    ├─files
    ├─img
    └─js

API用に追加した部分

  1. コントローラー
    Developer Toolsで作成すると、MVしかない。

  2. コレクション
    http://docs.phalconphp.com/en/latest/reference/micro.html#using-controllers-as-handlers

サンプルソース

app.php

※ルーターの役割

<?php

//APIのバージョン
$version = "1.0";

//未定義のパスにアクセスした場合に実行される
$app->notFound(array(new ControllerBase(), "notFoundAction"));

//コレクションのインクルード
include __DIR__ . '/app/collections/UserCollection.php';
UserCollection.php
<?php

use Phalcon\Mvc\Micro\Collection as MicroCollection;

$userCollection = new MicroCollection();

//メインコントローラー
$userCollection->setHandler(new UserController());

//コレクション内での共通prefix
$userCollection->setPrefix("/{$version}/user");

/**
  * ユーザー情報取得
  *
  * http://api.sample.com/1.0/user/
  * に対して
  * GETでアクセスすると
  * UserControllerのgetUserメソッドが実行される
  */
$userCollection->get("/", "getUser");

/**
  * ユーザー登録
  *
  * http://api.sample.com/1.0/user/register/
  * に対して
  * POSTでアクセスすると
  * UserControllerのpostUserメソッドが実行される
  */
$userCollection->post("/register", "postUser");

$app->mount($userCollection);
UserController.php
<?php

class UserController extends ControllerBase {
    
    public function getUser() {

    }
    
    public function postUser() {

    }
}
ControllerBase.php

※全てのコントローラーのベース

<?php

use Phalcon\Mvc\Controller;

class ControllerBase extends Controller
{
    /**
     * 
     * @param int $code
     * @param array $content
     */
    protected function output($code, $content=array()) {
        //Header
        $this->response->setContentType('application/json')
                       ->setStatusCode($code, null)
                       ->sendHeaders();
        //Body
        $this->response->setJsonContent($content)
                       ->send();
    }
    
    public function notFoundAction() {
        $this->output(404);
    }
}