CakePHP3でREST APIをちゃちゃっと作る方法

  • 39
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

CakePHP3でREST APIをちゃちゃっと作る方法

CakePHP3でREST APIをお手軽に作成してみました。
CRUD Pluginを利用して作成する方法になります。

2系とあまり変わらないかもしれませんがCakePHPでREST APIを作る方法として読んでいただけると嬉しいです。

参考記事
How to build a CakePHP 3 REST API in minutes

CRUD Pluginの特徴

  • 設置が簡単
  • 設置するだけで、CRUDの処理が使用可能
  • 独自処理を作成する場合はCRUD Plugin の Events機能を使用する。

REST API 作成手順

  1. CRUD Pluginの追加
  2. APIの有効化

CRUD Pluginの追加

まずはcomposerでPlugiinを追加してください。

    // CakePHP3
    composer require friendsofcake/crud:~4.0

    // CakePHP2 
    composer require friendsofcake/crud:~3.0

APIの有効化

  • API対象のControllerの指定

config/routes.php に下記を記述

    // PostsControllerをAPI化
    Router::scope('/', function ($routes) {
        $routes->resources('Posts');
    }
  • APIの設定

AppController に下記を記述

class AppController extends Controller
{

    use \Crud\Controller\ControllerTrait;

    /**
    * components
    *
    *
    */
    public $components = [
        'RequestHandler',
        'Crud.Crud' => [
            // API化対象アクション
            'actions' => [
                'Crud.Index',
                'Crud.View',
                'Crud.Add',
                'Crud.Edit',
                'Crud.Delete'
            ],
            // リスナー指定
            'listeners' => [
                'Crud.Api',
                'Crud.ApiPagination',
                'Crud.ApiQueryLog'
            ]
        ]
    ];    
  • APIのレスポンス形式の設定

config/routes.php に下記を記述

    // json、xml形式の許可
    Router::extensions(['json', 'xml']);

ここまでの設定で下記のアクションが使用可能になります。

    index: [GET] http://localhost/test_app/posts.json
    view:  [GET] http://192.168.56.10/rest_api/posts/1.json
    add:   [POST] http://localhost/test_app/posts.json
    edit:  [PUT] http://localhost/test_app/posts/1.json
    delete:[DELETE] http://localhost/test_app/posts/1.json

レスポンス例

    {
        success: true,
        data: [
            {
                id: 1,
                name: "test",
                created: null,
                modifited: null
            }
        ],
        pagination: {
            page_count: 1,
            current_page: 1,
            has_next_page: false,
            has_prev_page: false,
            count: 1,
            limit: null
        },
        queryLog: {
             default: [
                {
                    query:
                        "
                         SELECT
                             Posts.id AS "Posts__id",
                             Posts.name AS "Posts__name", 
                             Posts.created AS "Posts__created",
                             Posts.modifited AS "Posts__modifited"
                         FROM posts Posts
                         LIMIT 20
                         OFFSET 0
                        "
                    ,
                    took: 0,
                    params: [ ],
                    numRows: 1,
                    error: null
                },
                {
                    query: "SELECT (COUNT(*)) AS "count" FROM posts Posts",
                    took: 0,
                    params: [ ],
                    numRows: 1,
                    error: null
                }
        ],
}

独自処理

  1. CRUD PluginのEvents機能

CRUD Pluginには下記のEvents機能が準備されています。
(コールバックメソッドとほぼ同意)

  • beforeFilter
  • startup
  • beforeHandle
  • beforePaginate
  • afterPaginate
  • recordNotFound
  • invalidId
  • setFlash
  • beforeRender
  • beforeRedirect
  • beforeSave
  • afterSave
  • beforeFind
  • afterFind
  • beforeDelete
  • afterDelete
    // 実装方法例
    public function index() {
        $this->Crud->on('beforePaginate', function(Event $event) {

            // Search Pluginの検索条件の追加
            $event->subject->query = $this->Posts->find(
                'search',
                $this->request->query
            );

        });
        return $this->Crud->execute();
    }