concrete5にさくっとAPIを追加する
Posted by admin at 1:03 日時 2015/01/31
※ この記事はバージョン5.7以降を対象にしています
「APIを追加する」というのはWeb制作者向けに噛み砕いた言い方で、他のWebアプリケーションフレームワークの利用者にとっては「ルーティング」と言った方が分かりやすいでしょう。以下に最も簡単なサンプルを示します。
Route::register( '/api/core_version', function () { echo APP_VERSION; } );
このコードを、concrete5の /application/bootstrap/app.php に追記してください。すると、concrete5サイトに /api/core_version というURLでアクセスすると、インストールされているconcrete5のバージョンが画面に表示されるようになります。
ルーティングとは、このようにURLとあらかじめ用意された機能とをマッピングするための機能です。concrete5では、Symfony2のRoutingコンポーネントをカスタマイズして使っています。そのため基本的な使用方法は同じです。
The Routing Component (The Symfony Components)
ということで、Symfonyユーザーであればこれ以上読む必要はないのですが、他の事例も紹介しておきます。上記の例では、URLにクロージャを直接マッピングしていますが、通常はコントローラークラスにマッピングします。/application/bootstrap/app.php にさらに下記のように追記してみましょう。
Route::register( '/api/sitename', 'Application\Controller\Api::sitename' );
さらに、下記の内容で/application/controllers/api.php を作成してみましょう。
<?php namespace Application\Controller; use Config; class Api extends \Concrete\Core\Controller\Controller { function sitename() { echo Config::get('concrete.site'); } }
これで、/api/sitename にアクセスするとconcrete5サイトに設定したサイト名が表示されるようになります。
また、URLの一部をパラメーターとして扱うことができます。
Route::register( '/api/addition/{a}/{b}', 'Application\Controller\Api::addition' );
<?php namespace Application\Controller; class Api extends \Concrete\Core\Controller\Controller { function addition($a, $b) { echo $a + $b; } }
ここまで単純に echo() で出力しているだけですが、せっかくなのでJSONでもうちょっとWeb APIっぽいデータを出力してみましょう。
Route::register( '/api/pages', 'Application\Controller\Api::pages' );
<?php namespace Application\Controller; use PageList; use Core; class Api extends \Concrete\Core\Controller\Controller { function pages() { $pl = new PageList(); $pages = $pl->get(); $array = array(); foreach ($pages as $page) { $o = new \stdClass; $o->cID = $page->getCollectionID(); $o->name = $page->getCollectionName(); $o->path = ($page->getCollectionPath()) ? $page->getCollectionPath() : '/'; $array[] = $o; } Core::make('helper/ajax')->sendResult($array); } }
JSON REST APIっぽいことが至極かんたんにできてしまいました。ですが、こう言うことができたからと言って「concrete5はただのCMSではない!アプリケーションプラットフォームである!」とか言うつもりはないですよ。繰り返しになりますが、concrete5でバージョン5.7から採用されたSymfonyコンポーネントを使用しています。この機能を使いたいなら、Symfonyを使った方が簡単だし早いわけです。CMSはCMS。だと思います。
ただ、この「URLルーティングがさくっと追加できる」というのは、超☆便利ですので、ありがたいなぁと思っています。ただ、これだけでは認証がありませんので、サイト内検索をインクリメンタルサーチにしたり、ページ送りをAjaxにしたりくらいしか使い道がありません。なので、そのうちOAuth2認証サーバー機能を付加するだけのアドオンを作ろうと思っています。