Blog

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のバージョンが画面に表示されるようになります。

concrete5のバージョンが表示されるだけのURLができた

ルーティングとは、このように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;      }  }

URLで渡した数字を加算した結果が得られた

ここまで単純に 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);        }  }

concrete5のページ情報をJSONで出力

JSON REST APIっぽいことが至極かんたんにできてしまいました。ですが、こう言うことができたからと言って「concrete5はただのCMSではない!アプリケーションプラットフォームである!」とか言うつもりはないですよ。繰り返しになりますが、concrete5でバージョン5.7から採用されたSymfonyコンポーネントを使用しています。この機能を使いたいなら、Symfonyを使った方が簡単だし早いわけです。CMSはCMS。だと思います。

ただ、この「URLルーティングがさくっと追加できる」というのは、超☆便利ですので、ありがたいなぁと思っています。ただ、これだけでは認証がありませんので、サイト内検索をインクリメンタルサーチにしたり、ページ送りをAjaxにしたりくらいしか使い道がありません。なので、そのうちOAuth2認証サーバー機能を付加するだけのアドオンを作ろうと思っています。


Share this entry